1般的,我們的利用程序都不會簡單到只有1個界面,而是會有很多個界面,這個時候我們就會創建多個Activity,然后根據業務邏輯在多個Activity之間進行跳轉。
我們可以用切換Layout的方式進行手機頁面間的轉換。但是如果要轉換的頁面其實不單單只是背景、色彩或文字內容的不同,而是需要對全部Activity進行置換,并將主控權交給新的Activity,那就不是僅靠改變Layout就可以完成了,我們需要在這些Activity中進行跳轉及數據傳遞。
Activity跳轉實現起來也非常簡單,可使用Intent來實現利用程序內部的Activity跳轉。我們比較經常使用的有兩種。1種是單純的跳轉,即跳轉完以后就不管跳轉前的Activity了,另外一種是跳轉到下1個Activity,并等待它的返回結果進行相干的操作。
下面,我們以1個簡單的例子來加以說明。
1)1般的跳轉
一樣的,我們新建1個NextActivity.java類繼承自Activity,它的布局文件中只有1個TextView,顯示的內容為“This is Activity 2”。
假定我們剛剛創建的MyActivity.java為當前Activity,NextActivity.java為下1個要跳轉Activity。我們在main.xml布局文件中,增加1個按鈕,點擊后實現從MyActivity.java跳轉到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="跳轉"/> </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); } }); } |
我們運行1下來看看效果,如圖4⑷所示:
圖4⑷ Activity跳轉前
下面,我們點擊1下按鈕。這個時候,運行出錯了,毛病緣由是“android.content.ActivityNotFoundException”,這是由于我們在AndroidManifest.xml文件中沒有配置NextActivity,我們簡單配置1下:
<activity android:name=".NextActivity" android:label="@string/app_name"/> |
現在再點擊按鈕后,效果如圖4⑸所示:
圖4⑸ Activity跳轉后
可以看到,跳轉已成功了。
2)跳轉并返回值
可能很多時候,1般的跳轉其實不能滿足我們的需求。例如,我們填好1個表單,提交以后出錯了,我們回退以后想保存之前已填的數據,這樣的話,僅僅只是簡單的跳轉就不能滿足了。
下面,我們來看另外一種跳轉方式。在這個例子中,我們要實現從MyActivity跳轉到NextActivity,并當MyActivity接收到NextActivity返回來的“信息”時,MyActivity中顯示消息,MyActivity中跳轉代碼以下:
Intent intent = new Intent(); startActivityForResult(intent, 1); |
這樣就從MyActivity跳轉到了NextActivity,并傳入了1個要求碼“1”。同時,我們需要在MyActivity.java中重寫Activity中的onActivityResult方法,用于接收NextActivity.java中的返回碼,代碼以下:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(resultCode){ case RESULT_OK: // 當返回碼為RESULT_OK時進行相干操作 if(requestCode == 1){ Toast.makeText(Char4Activity.this, "返回已收到", Toast.LENGTH_LONG).show(); } break; } } |
這里需要注意的是resultCode相當于1個開關,當NextActivity.java中的開關打開時, 就會進行相應的處理了。
修改NextActivity的onCreate方法:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.next); setResult(RESULT_OK); finish(); } |
下面,我們來看看效果,如圖4⑹所示:
圖4⑹ Activity跳轉后返回值
很多時候,我們不是單單只進行Activity跳轉,而是在進行Activity跳轉的同時傳遞數據,這里我們就能夠利用Android.os.Bundle對象封閉數據的能力,將所要傳遞的數據或參數通過Bundle來傳遞不同Activity間的數據。還以之前的代碼為例,我們要實現從當前Activity跳轉到下1個Activity的同時,并傳入1個double型參數,1個String型參數,在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方發送參數,就必定有1方要接收參數。它的接收實現起來也很簡單,在NextActivity.java中代碼以下:
Bundle bundle = NextActivity.this.getIntent().getExtras(); double height = bundle.getDouble("height"); String name = bundle.getString("name"); |
經驗分享: 需要注意的是,當履行startActivityForResult時,requestCode值需要>=0,否則,startActivityForResult就變成了 startActivity;另外,有這樣1種情況,假定現在有兩個Activity:A和B。Activity A使用startActivityForResult跳轉到Activity B,跟蹤后發現要跳轉的Activity B并沒有被立即啟動,而是直接履行了Activity A的onActivityResult方法,緣由是把要啟動的Activity B的launchmode設置成singleTask了,這個時候它會先履行onActivityResult方法,然后再啟動activity,所以就得不到我們想要的結果。 |