• pk10牛牛官网

  • pk10牛牛官网

  • pk10牛牛官网

  • pk10牛牛官网

pk10牛牛官网

作者lu)nbsp; 發(fa)布日期︰2020-02-26 03:04:56
Tag標(biao)簽︰數據  
  • 出(chu)處: http://blog.csdn.net/forwardyzk/article/details/46620021

    在界面(mian)跳轉的時候,我們使用Intent,Intent怎樣傳遞數據,可以(yi)傳遞什麼數據呢.下面(mian)我們就以(yi)下這幾(ji)方便做介(jie)紹(shao).

    1.Intent傳遞怎樣傳遞數據

    2.Intent可以(yi)傳遞什麼類型數據

    2.1.Intent傳遞基本數據和基本數據數組

    2.2.Intent傳遞Parcelable對象(xiang)

    2.3.Intent傳遞Serializable對象(xiang)

    2.4.Intent傳遞String,Integer,CharSequence泛型集合

    2. 5.Intent傳遞基本自(zi)定義(yi)對象(xiang)集合

    3.怎樣使用startActivityForResult,OnActivityResult,setResut之間的怎樣傳遞數據

    Intent怎樣傳遞數據

    Intent之間傳遞數據是(shi)通過Bundle傳遞.

    查(cha)看Intent對象(xiang)的方法(fa)putExtra方法(fa)的源碼.

    這里是(shi)以(yi)傳遞int類型的數據為例,你也可以(yi)查(cha)看傳遞其他(ta)類型數據的方法(fa).經查(cha)看源碼,發(fa)現其實就是(shi)把傳遞的key-value放在了mExtras對象(xiang)中,就是(shi)Bundle對象(xiang)中.

    獲(huo)取數據的時候,我們在目標(biao)Activity中,先獲(huo)取Intent對象(xiang)(getIntent()),然後使用getXXX方法(fa),通過key獲(huo)取值

    Intent可以(yi)傳遞什麼類型的數據

    Intent傳遞基本數據和基本數據數組

    在MainActivity開啟BaseActivity

    在ManActivity中傳遞數據

    public final static String BASE = "base"; /** * 傳遞基本對象(xiang)數據,和數組 */ public void base() { Intent intent = new Intent(MainActivity.this, BaseActivity.class); intent.putExtra(BASE, 110); startActivity(intent); }

     

    在BaseAcitvity獲(huo)取MainActvity傳遞過來的數據

     

    private void initData() { //獲(huo)取Intent後,通過key獲(huo)取對應的值,然後把值設置給TextView int base = getIntent().getIntExtra(MainActivity.BASE, 0); tv.setText(String.valueOf(base)); }

     

    這里就以(yi)int類型為例,其他(ta)的基本數據類型用法(fa)和這是(shi)一樣的.

    Intent傳遞Parcelable對象(xiang)

    我們先看官方文檔是(shi)怎樣實現這個接口的

    必(bi)須(xu)重寫writeToparcel和describeContents方法(fa),必(bi)須(xu)創建一個Parcelable.Create 類型的CREATOR對象(xiang).

    首(shou)先要自(zi)定義(yi)Persion類,實現Parcelable接口.

     

    public class Persion implements Parcelable { private String name; private int age; public Persion() { } public Persion(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Persion{" +  "name='" + name + ''' +  ", age=" + age +  '}'; } public static final Parcelable.Creator<Persion> CREATOR = new Parcelable.Creator<Persion>() { @Override public Persion createFromParcel(Parcel source) {  Persion persion = new Persion();  persion.name = source.readString();  persion.age = source.readInt();  return persion; } @Override public Persion[] newArray(int size) {  return new Persion[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); }}

    在MainActivity開啟ParceActivity.

     

    在ManActivity傳遞Parcelable類型數據

     

    /** * 傳遞Parcelable對象(xiang) */ public void parce() { Persion persion = new Persion(); persion.setName("張(zhang)三(san)"); persion.setAge(20); Intent intent = new Intent(MainActivity.this, ParceActivity.class); intent.putExtra(PARCE, persion); startActivity(intent); }

    在ParceActivity獲(huo)取數據

     

     

     TextView tv = (TextView) findViewById(R.id.tv); Persion p = getIntent().getParcelableExtra(MainActivity.PARCE); tv.setText(p.toString());

    使用的是(shi)getParcelableExtra方法(fa),通過key獲(huo)取值.

     

    Intent傳遞Serializable對象(xiang)

    自(zi)定義(yi)Student類實現Serializable接口

     

    public class Student implements Serializable { private String stuName; private String stuClassName; public Student(String stuName, String stuClassName) { this.stuName = stuName; this.stuClassName = stuClassName; } @Override public String toString() { return "Student{" +  "stuName='" + stuName + ''' +  ", stuClassName='" + stuClassName + ''' +  '}'; }}
    在MainActivity開啟SerActivity

     

    在MainActivity傳遞數據

     

     public final static String SERCI = "serci"; /** * 傳遞Serializable對象(xiang) */ public void serial() { Student student = new Student("李四(si)", "計算機一班"); Intent intent = new Intent(MainActivity.this, SerActivity.class); intent.putExtra(MainActivity.SERCI, student); startActivity(intent); }

    在SerActivity獲(huo)取傳遞的數據

     

     

    TextView tv = (TextView) findViewById(R.id.tv); Student s = (Student) getIntent().getSerializableExtra(MainActivity.SERCI); tv.setText(s.toString());

     

    當我們傳遞自(zi)定義(yi)類的時候,我們是(shi)要實現Parcelable還是(shi)實現Serializable.

     

    實現Serializable接口是(shi)為了將(jiang)對象(xiang)轉化為字節(jie)流,可以(yi)存(cun)到本地(di)外存(cun)儲設備上,或(huo)者通過網絡(luo)傳輸,當使用此(ci)對象(xiang)的時候,可以(yi)講此(ci)字節(jie)流重新序(xu)列(lie)化為對應的對象(xiang).

    實現Parcelable對象(xiang),其不能將(jiang)對象(xiang)存(cun)到本地(di)外存(cun)儲設置上,因為parcelable是(shi)輕(qing)量級的序(xu)列(lie)化和反(fan)序(xu)列(lie)化機制,全部是(shi)在內存(cun)中進行(xing)序(xu)列(lie)化和反(fan)序(xu)列(lie)華化,效率比較高.

     

    建議:

    當你的對象(xiang)需要在外部存(cun)儲設備上存(cun)儲,那麼就實現Serializable接口,如(ru)果你的對象(xiang)只是(shi)在界面(mian)之間傳遞,不需要存(cun)儲的本地(di)外存(cun)儲設備,還是(shi)最好(hao)實現Parcelable對象(xiang).

     

    Intent傳遞String,Integer,CharSequence泛型集合

    這里以(yi)String類型的集合為例,

    在MainActivity中開啟ListActivity

    在MainActivity傳遞數據

     

    /** * 傳遞基本數據List集合,只有傳遞String,Integer,CharSequence泛型的集合 */ public void list() { ArrayList<String> stringList = new ArrayList<String>(); stringList.add("abc"); stringList.add("def"); stringList.add("123"); stringList.add("456"); Intent intent = new Intent(MainActivity.this, ListActivity.class); intent.putStringArrayListExtra(MainActivity.LIST, stringList); startActivity(intent); }

     

    在ListActiviy獲(huo)取數據

     

     

    TextView tv = (TextView) findViewById(R.id.tv); //獲(huo)取String List List<String> stringList = getIntent().getStringArrayListExtra(MainActivity.LIST); //拼接集合中的String boolean flag = true; StringBuffer sb = new StringBuffer(); sb.append("["); for (String s : stringList) {  if (flag) {  sb.append(s);  flag = false;  } else {  sb.append(",").append(s);  } } sb.append("]"); tv.setText(sb.toString());

     

     

    Intent傳遞基本自(zi)定義(yi)對象(xiang)集合

    傳遞自(zi)定對象(xiang)的集合,自(zi)定義(yi)對象(xiang)必(bi)須(xu)實現Parcelable

    在MainActivity中開啟CustomActivity

    在MainActivity傳遞數據

    使用putParcelableArrayListExtra方法(fa)傳遞數據

     

    /** * 傳遞自(zi)定義(yi)bean泛型集合,bean必(bi)須(xu)繼承Parcelable */ public void custom() { ArrayList<Persion> pList = new ArrayList<Persion>(); pList.add(new Persion("張(zhang)三(san)", 30)); pList.add(new Persion("李四(si)", 31)); pList.add(new Persion("王五", 32)); Intent intent = new Intent(MainActivity.this, CustomActivity.class); intent.putParcelableArrayListExtra(MainActivity.CUSTOM, pList); startActivity(intent); Bundle bundle = new Bundle(); }

     

    在CustomActivity獲(huo)取數據

    使用getParcelableArrayListExtra獲(huo)取數據

     

    TextView tv = (TextView) findViewById(R.id.tv); //獲(huo)取persionList List<Persion> persionList = getIntent().getParcelableArrayListExtra(MainActivity.CUSTOM); //拼接集合中的Persion boolean flag = true; StringBuffer sb = new StringBuffer(); sb.append("["); for (Persion persion : persionList) {  if (flag) {  sb.append(persion.toString());  flag = false;  } else {  sb.append(",").append(persion.toString());  } } sb.append("]"); tv.setText(sb.toString());

    怎樣使用startActivityForResult,OnActivityResult,setResut之間的怎樣傳遞數據

     

    在MainActivity中使用startActivityForResult開去ForResultActivity,必(bi)須(xu)要在MainActiviy中重寫OnActivityResult方法(fa),當ForResultActivity界面(mian)finish()掉後,會自(zi)動的調用MainActivity中的OnActivityResult方法(fa).

    如(ru)果在ForResultActivity界面(mian)中要傳遞數據給MainAcitivity,就是(shi)用setResult方法(fa)傳遞,一定要保證setResult方法(fa)是(shi)在finish()之前(qian)調用的.如(ru)果不需要ForResultActivity界面(mian)傳遞給MainActivity,就不需要使用setResult方法(fa)

    當點擊返回鍵的時候,界面(mian)直接finish掉了,不能保證finish之前(qian)調用setResult方法(fa),所以(yi)要ForResultActivity中重寫onBackPressed方法(fa).

    在MainActivity界面(mian)傳遞數據

     

    public final static String FORRESULT = "forresult"; public final static int RESULT_OK=100; private void forResult() { Intent intent = new Intent(MainActivity.this, ForResultActivity.class); intent.putExtra(FORRESULT, "for result");// startActivity(intent); startActivityForResult(intent, RESULT_OK); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) {  case RESULT_OK:  String str = data.getStringExtra(FORRESULT);  Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();  break; } }

    在ForResultAcitivity傳遞回去數據

     

     

    public class ForResultActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_for_result); //獲(huo)取MainActivity傳遞過來的數據 String forResult= getIntent().getStringExtra(MainActivity.FORRESULT); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {//  Intent intent=new Intent();//  intent.putExtra("bb","aa");  setResult(MainActivity.RESULT_OK,getIntent());//將(jiang)MainActivity傳過來的數據傳遞回去,也可以(yi)創建新的Intent傳回去  finish();  } }); } @Override public void onBackPressed() { setResult(RESULT_OK,getIntent());//將(jiang)MainActivity傳過來的數據傳遞回去,也可以(yi)創建新的Intent傳回去 super.onBackPressed(); }}


     

    到此(ci)Intent傳遞數據已經介(jie)紹(shao)完了,其中每個類型只舉了一個例子(zi),具體什麼類型的,可以(yi)查(cha)看對應的方法(fa),用法(fa)和上面(mian)介(jie)紹(shao)的是(shi)一樣的.

     

About IT165 -廣告服務(wu) -隱私聲明 -版權申明 -免(mian)責條(tiao)款(kuan) -網站地(di)圖 -網友投(tou)稿 -聯系方式
本站內容(rong)來自(zi)于互(hu)聯網,僅供用于網絡(luo)技術學習,學習中xing)胱zun)循(xun)相(xiang)關(guan)法(fa)律法(fa)規
pk10牛牛官网 | 下一页