標籤:
一個Android應用程式很少會只有一個Activity對象,如何在多個Activity之間進行跳轉,而且能夠互相傳值是一個很基本的要求。
本次我們就講一下,Android中頁面跳轉以及傳值的幾種方式!
Activity跳轉與傳值,主要是通過Intent類來串連多個Activity.
1. Intent顯式意圖
(1) 最常見最一般的頁面跳轉代碼,很簡單,如下:
Intent intent = new Intent(A.this, SecondActivity.class);startActivity(intent);
也可以這樣寫:
Intent intent = new Intent(); intent.setClass(A.this, SecondActivity.class);startActivity(intent);
(2) 當然,你需要建立一個SecondActivity的介面,並繼承activity,重寫onCreate方法:
1 public class SecondActivity extends Activity {2 3 @Override4 protected void onCreate(Bundle savedInstanceState) {5 super.onCreate(savedInstanceState);6 setContentView(R.layout.activity_second);7 }8 9 }
(3) 當然建立了一個activity後記得在資訊清單檔中進行註冊.
(4) 在onCreate方法裡設定布局檔案: R.layout.activity_second,所以需要在res目錄下建立
這樣就可以使用顯實現頁面跳轉了.
2.隱式意圖
隱式意圖與顯式意圖在寫法上有以下幾點不一樣:
(1) 在資訊清單檔中註冊需要加意圖過濾器
1 <activity android:name="com.example.intent.SecondActivity"> 2 <intent-filter > 3 4 <action android:name="com.itheima.open02"/> 5 6 <!-- 一般配置 隱式意圖 的時候就需要寫 category 7 表示用在 預設的裝置中 (預設的運行在 手機中 的) --> 8 9 <category android:name="android.intent.category.DEFAULT"></category>10 11 <data android:scheme="haha" />12 <data android:mimeType="image/jpeg"/>13 <data android:host="www.google.com"/>14 </intent-filter>15 </activity>
(2) 在建立Intent對象時:
1 Intent intent = new Intent();2 3 intent.setAction("com.itheima.open02");4 5 intent.addCategory("android.intent.category.DEFAULT");6 7 intent.setDataAndType(Uri.parse("haha://www.google.com"), "image/jpeg");8 9 startActivity(intent);
這裡需要注意一點:
data和type可以單獨使用,但是他倆是互斥的
也就是說,使用了data就不能使用type,這個看API可以知道
如果想同時使用他倆的話,就需要用setDataAndType方法
注意: 隱式意圖必須包含動作(action),以及資料(data)
3. 顯式意圖和隱式意圖的區別
- 顯式意圖: 一般用於啟用應用程式內部的
- 隱式意圖: 一般用於啟用其他應用程式的組件
4. 資料傳遞
(1) 要想實現在頁面跳轉的同時傳遞資料,只需要用一個方法即可:putExtra()
1 Intent intent = new Intent(this, SecondActivity.class);2 intent.putExtra("name", et_name.getText()+"");3 startActivity(intent);
(2) 如果要傳遞複雜一點的資料,片:
putExtra可以傳遞一個Parcelable對象,而圖片的bitmap是Parcelable的子類
所以可以這樣操作:
1 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.logo);2 intent.putExtra("pic", bitmap);5. 資料接收
1 // 首先擷取到意圖對象2 Intent intent = getIntent();3 4 // 擷取到傳遞過來的姓名5 String name = intent.getStringExtra("name");6 7 // 擷取到傳遞過來的圖片8 Bitmap bitmap = intent.getParcelableExtra("pic");6. startActivityForResult
如果用正向傳遞的方式是可以實現資料的迴歸的,但是這樣做的壞處是開啟了很多個Activity累積到棧中,當點擊返回的時候就會逐一開啟之前的Activity,這樣的使用者
體驗是非常不好的,所以通過資料的反向傳遞的方式保證Activity只有當前的一個,當使用者點擊返回時可以直接退出。
下面以一種需求為例,講解startActivityForResult,傳送簡訊小助手:
使用者點擊"選擇模板"跳到簡訊模板的介面,然後點擊某一條簡訊,直接將選擇的簡訊返回到頁面中
主介面:
選擇模板簡訊的介面:
選擇連絡人介面:
這裡的列表是用listview來做的,點擊對應的listview可以將結果返回到主介面中.
以下是兩個按鈕點擊事件的代碼:
1 /** 2 * 選擇簡訊模板 3 * @param view 4 */ 5 public void selectSms(View view){ 6 //點擊後跳轉到簡訊模板介面 7 Intent intent = new Intent(this, SmsActivity.class); 8 9 //兩個參數:Intent intent 意圖對象10 //int requestCode 請求碼11 startActivityForResult(intent, 2);12 }13 /**14 * 選擇收信人15 */16 public void addContacts(View view) {17 // 點擊後跳到連絡人清單介面18 Intent intent = new Intent(this, ContactsActivity.class);19 20 //為了一個結果 去啟動另外的一個 activity 介面 21 startActivityForResult(intent, 1);22 }
注意: 還需要重寫onActivityResult()方法,來接收返回的資料
範例程式碼如下:
1 @Override 2 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 3 super.onActivityResult(requestCode, resultCode, data); 4 5 // resultCode : 結果碼, 用來鑒別 到底是 哪個 結果 ... 6 if (data != null) { 7 if (resultCode == 1) {// 說明是連絡人的返回結果 8 contact = data.getStringExtra("contact"); 9 et_contact.setText(contact);10 }else if(resultCode == 2){//說明是簡訊模板的返回結果11 sms = data.getStringExtra("sms");12 et_content.setText(sms);13 }14 }15 }
以下是簡訊模板的範例程式碼:
1 public class SmsActivity extends Activity { 2 3 String [] sms = {"簡訊1","簡訊2","簡訊3","簡訊4"}; 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_sms); 8 9 ListView lv_sms = (ListView) findViewById(R.id.lv_sms);10 11 lv_sms.setAdapter(new ArrayAdapter<String>(this, R.layout.item_sms, sms));12 13 lv_sms.setOnItemClickListener(new OnItemClickListener() {14 15 @Override16 public void onItemClick(AdapterView<?> parent, View view,17 int position, long id) {18 19 String template = sms[position];20 21 Intent data = new Intent();22 23 data.putExtra("sms", template);24 25 //int resultCode, 結果碼,用於區分到底是哪個的返回資料26 //Intent data 27 setResult(2, data);28 29 finish();30 }31 });32 }33 34 }
好了,關於頁面跳轉就先介紹到這裡.
Android中實現activity的頁面跳轉並傳值