標籤:android應用 android開發
4.1.5Activity互動—Activity跳轉
一般的,我們的應用程式都不會簡單到只有一個介面,而是會有很多個介面,這個時候我們就會建立多個Activity,然後根據商務邏輯在多個Activity之間進行跳轉。
我們可以用切換Layout的方式進行手機頁面間的轉換。但是如果要轉換的頁面並不單單只是背景、顏色或文字內容的不同,而是需要對整個Activity進行置換,並將主控權交給新的Activity,那就不是僅靠改變Layout就能完成了,我們需要在這些Activity中進行跳轉及資料傳遞。
Activity跳轉實現起來也非常簡單,可以使用Intent來實現應用程式內部的Activity跳轉。我們比較常用的有兩種。一種是單純的跳轉,即跳轉完之後就不管跳轉前的Activity了,另一種是跳轉到下一個Activity,並等待它的返回結果進行相關的操作。
下面,我們以一個簡單的例子來加以說明。
1)一般的跳轉
同樣的,我們建立一個NextActivity.java類繼承自Activity,它的布局檔案中只有一個TextView,顯示的內容為“This is Activity 2”。
假設我們剛剛建立的MyActivity.java為當前Activity,NextActivity.java為下一個要跳轉Activity。我們在main.xml布局檔案中,增加一個按鈕,點擊後實現從MyActivity.java跳轉到NextActivity.java的效果,布局檔案代碼如下:
<?xml version="1.0" encoding="utf-8"?> <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); } }); } |
我們運行一下來看看效果,4-4所示:
圖4-4 Activity跳轉前
下面,我們點擊一下按鈕。這個時候,運行出錯了,錯誤原因是“android.content.ActivityNotFoundException”,這是因為我們在AndroidManifest.xml檔案中沒有配置NextActivity,我們簡單配置一下:
<activity android:name=".NextActivity" android:label="@string/app_name"/> |
現在再點擊按鈕後,效果4-5所示:
圖4-5 Activity跳轉後
可以看到,跳轉已經成功了。
--------------------------------------------試著放個廣告 現在沒工作 要生存 沒辦法平安陸金所 隸屬於平安集團的p2p平台年投資報酬率7%-9% 是替代銀行理財的首選個人經驗教訓 推薦投資安鑫或者有擔保的彩虹項目不要投資安e 那個幾乎無法轉讓 想提前提現非常困難註冊連結 http://affiliate.lufax.com/action/36XBU用此連結註冊 你我都會有幾十元的額外現金獎勵--------------------------------------------
2)跳轉並傳回值
可能很多時候,一般的跳轉並不能滿足我們的需求。例如,我們填好一個表單,提交之後出錯了,我們回退之後想保留之前已填的資料,這樣的話,僅僅只是簡單的跳轉就不能滿足了。
下面,我們來看另一種跳轉方式。在這個例子中,我們要實現從MyActivity跳轉到NextActivity,併當MyActivity接收到NextActivity返回來的“資訊”時,MyActivity中顯示訊息,MyActivity中跳轉代碼如下:
Intent intent = new Intent(); intent.setClass(MyActivity.this, NextActivity.class); startActivityForResult(intent, 1); |
這樣就從MyActivity跳轉到了NextActivity,並傳入了一個請求碼“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相當於一個開關,當NextActivity.java中的開關開啟時, 就會進行相應的處理了。
修改NextActivity的onCreate方法:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.next); setResult(RESULT_OK); finish(); } |
下面,我們來看看效果,4-6所示:
圖4-6 Activity跳轉後傳回值
4.1.6 Activity中資料傳遞
很多時候,我們不是單單只進行Activity跳轉,而是在進行Activity跳轉的同時傳遞資料,這裡我們就可以利用Android.os.Bundle對象封閉資料的能力,將所要傳遞的資料或參數通過Bundle來傳遞不同Activity間的資料。還以之前的代碼為例,我們要實現從當前Activity跳轉到下一個Activity的同時,並傳入一個double型參數,一個String型參數,在MyActivity.java中代碼如下:
Intent intent = new Intent(); intent.setClass(MyActivity.this, NextActivity.class); Bundle bundle = new Bundle(); double height = 1.74; String name = "li lei"; bundle.putDouble("height", height); bundle.putString("name",name); intent.putExtras(bundle); startActivity(intent); |
有一方發送參數,就必然有一方要接收參數。它的接收實現起來也很簡單,在NextActivity.java中代碼如下:
Bundle bundle = NextActivity.this.getIntent().getExtras(); double height = bundle.getDouble("height"); String name = bundle.getString("name"); |
經驗分享: 需要注意的是,當執行startActivityForResult時,requestCode值需要>=0,否則,startActivityForResult就變成了 startActivity;另外,有這樣一種情況,假設現在有兩個Activity:A和B。Activity A使用startActivityForResult跳轉到Activity B,跟蹤後發現要跳轉的Activity B並沒有被立即啟動,而是直接執行了Activity A的onActivityResult方法,原因是把要啟動的Activity B的launchmode設定成singleTask了,這個時候它會先執行onActivityResult方法,然後再啟動activity,所以就得不到我們想要的結果。 |
第四章 Android開發三大基石—Activity、Service和Handler(3)