第四章 Android開發三大基石—Activity、Service和Handler(3)

來源:互聯網
上載者:User

標籤: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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.