1般的,我們的利用程序都不會(huì)簡單到只有1個(gè)界面,而是會(huì)有很多個(gè)界面,這個(gè)時(shí)候我們就會(huì)創(chuàng)建多個(gè)Activity,然后根據(jù)業(yè)務(wù)邏輯在多個(gè)Activity之間進(jìn)行跳轉(zhuǎn)。
我們可以用切換Layout的方式進(jìn)行手機(jī)頁面間的轉(zhuǎn)換。但是如果要轉(zhuǎn)換的頁面其實(shí)不單單只是背景、色彩或文字內(nèi)容的不同,而是需要對(duì)全部Activity進(jìn)行置換,并將主控權(quán)交給新的Activity,那就不是僅靠改變Layout就可以完成了,我們需要在這些Activity中進(jìn)行跳轉(zhuǎn)及數(shù)據(jù)傳遞。
Activity跳轉(zhuǎn)實(shí)現(xiàn)起來也非常簡單,可使用Intent來實(shí)現(xiàn)利用程序內(nèi)部的Activity跳轉(zhuǎn)。我們比較經(jīng)常使用的有兩種。1種是單純的跳轉(zhuǎn),即跳轉(zhuǎn)完以后就不管跳轉(zhuǎn)前的Activity了,另外一種是跳轉(zhuǎn)到下1個(gè)Activity,并等待它的返回結(jié)果進(jìn)行相干的操作。
下面,我們以1個(gè)簡單的例子來加以說明。
1)1般的跳轉(zhuǎn)
一樣的,我們新建1個(gè)NextActivity.java類繼承自Activity,它的布局文件中只有1個(gè)TextView,顯示的內(nèi)容為“This is Activity 2”。
假定我們剛剛創(chuàng)建的MyActivity.java為當(dāng)前Activity,NextActivity.java為下1個(gè)要跳轉(zhuǎn)Activity。我們?cè)趍ain.xml布局文件中,增加1個(gè)按鈕,點(diǎn)擊后實(shí)現(xiàn)從MyActivity.java跳轉(zhuǎn)到NextActivity.java的效果,布局文件代碼以下:
<?xml version="1.0" encoding="utf⑻"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="This is Activity 1"/> <Button android:id="@+id/my_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="跳轉(zhuǎn)"/> </LinearLayout> |
然后,我們來看看MyActivity中的代碼:
private Button btn;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button)findViewById(R.id.my_button); btn.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(MyActivity.this, NextActivity.class); startActivity(intent); } }); } |
我們運(yùn)行1下來看看效果,如圖4⑷所示:
圖4⑷ Activity跳轉(zhuǎn)前
下面,我們點(diǎn)擊1下按鈕。這個(gè)時(shí)候,運(yùn)行出錯(cuò)了,毛病緣由是“android.content.ActivityNotFoundException”,這是由于我們?cè)贏ndroidManifest.xml文件中沒有配置NextActivity,我們簡單配置1下:
<activity android:name=".NextActivity" android:label="@string/app_name"/> |
現(xiàn)在再點(diǎn)擊按鈕后,效果如圖4⑸所示:
圖4⑸ Activity跳轉(zhuǎn)后
可以看到,跳轉(zhuǎn)已成功了。
2)跳轉(zhuǎn)并返回值
可能很多時(shí)候,1般的跳轉(zhuǎn)其實(shí)不能滿足我們的需求。例如,我們填好1個(gè)表單,提交以后出錯(cuò)了,我們回退以后想保存之前已填的數(shù)據(jù),這樣的話,僅僅只是簡單的跳轉(zhuǎn)就不能滿足了。
下面,我們來看另外一種跳轉(zhuǎn)方式。在這個(gè)例子中,我們要實(shí)現(xiàn)從MyActivity跳轉(zhuǎn)到NextActivity,并當(dāng)MyActivity接收到NextActivity返回來的“信息”時(shí),MyActivity中顯示消息,MyActivity中跳轉(zhuǎn)代碼以下:
Intent intent = new Intent(); startActivityForResult(intent, 1); |
這樣就從MyActivity跳轉(zhuǎn)到了NextActivity,并傳入了1個(gè)要求碼“1”。同時(shí),我們需要在MyActivity.java中重寫Activity中的onActivityResult方法,用于接收NextActivity.java中的返回碼,代碼以下:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(resultCode){ case RESULT_OK: // 當(dāng)返回碼為RESULT_OK時(shí)進(jìn)行相干操作 if(requestCode == 1){ Toast.makeText(Char4Activity.this, "返回已收到", Toast.LENGTH_LONG).show(); } break; } } |
這里需要注意的是resultCode相當(dāng)于1個(gè)開關(guān),當(dāng)NextActivity.java中的開關(guān)打開時(shí), 就會(huì)進(jìn)行相應(yīng)的處理了。
修改NextActivity的onCreate方法:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.next); setResult(RESULT_OK); finish(); } |
下面,我們來看看效果,如圖4⑹所示:
圖4⑹ Activity跳轉(zhuǎn)后返回值
很多時(shí)候,我們不是單單只進(jìn)行Activity跳轉(zhuǎn),而是在進(jìn)行Activity跳轉(zhuǎn)的同時(shí)傳遞數(shù)據(jù),這里我們就能夠利用Android.os.Bundle對(duì)象封閉數(shù)據(jù)的能力,將所要傳遞的數(shù)據(jù)或參數(shù)通過Bundle來傳遞不同Activity間的數(shù)據(jù)。還以之前的代碼為例,我們要實(shí)現(xiàn)從當(dāng)前Activity跳轉(zhuǎn)到下1個(gè)Activity的同時(shí),并傳入1個(gè)double型參數(shù),1個(gè)String型參數(shù),在MyActivity.java中代碼以下:
Intent intent = new Intent(); Bundle bundle = new Bundle(); double height = 1.74; String name = "li lei"; bundle.putDouble("height", height); bundle.putString("name",name); intent.putExtras(bundle); |
有1方發(fā)送參數(shù),就必定有1方要接收參數(shù)。它的接收實(shí)現(xiàn)起來也很簡單,在NextActivity.java中代碼以下:
Bundle bundle = NextActivity.this.getIntent().getExtras(); double height = bundle.getDouble("height"); String name = bundle.getString("name"); |
經(jīng)驗(yàn)分享: 需要注意的是,當(dāng)履行startActivityForResult時(shí),requestCode值需要>=0,否則,startActivityForResult就變成了 startActivity;另外,有這樣1種情況,假定現(xiàn)在有兩個(gè)Activity:A和B。Activity A使用startActivityForResult跳轉(zhuǎn)到Activity B,跟蹤后發(fā)現(xiàn)要跳轉(zhuǎn)的Activity B并沒有被立即啟動(dòng),而是直接履行了Activity A的onActivityResult方法,緣由是把要啟動(dòng)的Activity B的launchmode設(shè)置成singleTask了,這個(gè)時(shí)候它會(huì)先履行onActivityResult方法,然后再啟動(dòng)activity,所以就得不到我們想要的結(jié)果。 |