Android中實現activity的頁面跳轉並傳值


一個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     @Override
4     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.google.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.google.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             @Override
16             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 }

 

好了,關於頁面跳轉就先介紹到這里.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM