1. 程式人生 > >從零學Android(三)、Activity頁面的跳轉

從零學Android(三)、Activity頁面的跳轉

在前面的學習中,我們已經建立好了一個擁有一個文字域和一個按鈕的Activity。今天的學習任務就是在MyActivity中加入一些程式碼,當用戶點選按鈕的時候跳轉到另外一個Activity頁面。

按鈕的響應事件

要實現上面的功能,我們首先需要做的就是學習怎麼去響應按鈕的點選事件。

第一步:開啟我們的activity_my.xml,然後給Button加入android:onClick屬性,顧名思義,“onClick”的含義就是“當點選時”,這個屬性對應的屬性值就是一個在對應的Activity頁面程式碼中的一個方法名稱,當用戶點選按鈕的時候,Android系統會幫我們執行這個方法。

<Button
        android:id="@+id/btn_send"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btn_send"
        android:onClick="sendMessage"/>
第二步:在MyActivity.java檔案中新增sendMessage()方法,當按鈕被點選時,彈出一個Toast提示。
/**
     * 點選"傳送"按鈕的回撥方法
     * 注意:這個方法必須是
     *          public修飾
     *          返回值必須是void
     *          引數必須是View
     * @param view 觸發回撥方法的View
     */
    public void sendMessage(View view){
        Toast.makeText(this,getString(R.string.txt_click_send_btn),Toast.LENGTH_SHORT).show();
    }

注意方法註釋部分的說明。這裡我們用到了字串資源txt_click_send_btn,它定義在res/value/strings.xml中:

<string name="txt_click_send_btn">傳送按鈕被點選了</string>

現在,我們看看效果:

好了,現在按鈕的點選響應我們已經實現了,那麼接下來就是該跳轉到另外一個Activity了。

建立第二個Activity - SecondActivity

選中我們的專案包,點選滑鼠右鍵,選擇New - > Activity ->BlankActivity,類似於前面我們學的,我們設定ActivityName為SecondActivity,

然後直接點選Finish,系統就幫我們建立好了SecondActivity.java和activity_second.xml。

注意:所有的Activity的子類都必須重寫onCreate()方法,而且,我們必須在onCreate()方法中呼叫setContentView()方法,關聯Activity頁面對應的layout佈局檔案。

現在我們來改寫系統為我們生成的activity_second.xml佈局檔案:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        android:textColor="#0000FF"/>

</LinearLayout>
這裡我們使用了一個文字顯示控制元件TextView,並且使用它的android:textSizeandroid:textColor屬性設定它的文字大小為15sp,文字顏色為藍色。它可以用來顯示我們從第一個頁面傳遞過來的資料。

建立一個Intent

現在,兩個Activity頁面都已經有了,我們要怎麼跳轉呢?要想在當前的Activity頁面開啟另外一個Activity,我們需要藉助一樣東西,這個東西就是,我們可以稱之為“意圖”,我們取建立一個“意圖”,一個希望從當前頁面到另外一個頁面的”意圖“:

public void sendMessage(View view){
        Intent intent = new Intent(this,SecondActivity.class);
    }
這樣,我們的意圖就已經建立好了(提一下:在Android Studio中,我們使用Alt + Enter匯入包),然後我們要怎麼去將這個意圖傳送出去呢?我們需要通過Activity類中的
public void sendMessage(View view){
        Intent intent = new Intent(this,SecondActivity.class);
        startActivity(intent);
    }
程式碼就這麼點,我們去看看效果:


這時候點選按鈕,已經能跳轉到SecondActivity頁面了,雖然第二個頁面上面內容都沒有,現在我們要做的就是,將第一個頁面裡使用者在文字域中輸入的內容傳遞到SecondActivity頁面。我們明確下我們要做的事情:

首先,第一步:我們必須獲取到第一個頁面中的文字域的View物件

第二步:我們必須通過這個文字域的View物件獲取到使用者輸入的內容

第三步:將獲取到的內容通過Intent傳遞到第二個頁面

現在我們按照上面的思路繼續去修改我們的程式碼:

public void sendMessage(View view){
        Intent intent = new Intent(this,SecondActivity.class);
        //第一步、通過Activity的findViewById()獲取文字域EditText物件  由於findViewById()方法的返回值
        // 是一個View物件  所以我們需要將其向下轉型為為文字域EditText物件  引數ID是我們在layout檔案activity_my.xml
        //中給文字域設定的android:id屬性的值
        EditText edit_messgae = (EditText) findViewById(R.id.edit_message);
        //第二步、通過getText().toString()方法獲取到文字域中使用者輸入的內容
        String message = edit_messgae.getText().toString();
        //第三步、將使用者輸入的內容通過Intent的putExtra()方法封裝進Intent中,隨著Intent傳遞到下一個頁面
        //其中的MessageKey就相當於一個房間號,我們通過putExtra()將資料放到了對應的房間中,
        //當取資料時,你要通過這個房間號才能從Intent對應的房間中取出對應的資料
        intent.putExtra("MessageKey",message);
        startActivity(intent);
    }
上面的步驟在註釋中已經寫得很清楚了,這個時候我們就可以去第二個頁面中取資料並且顯示到文字框中了。同樣,我們分析步驟如下:

第一步:首先我們需要擷取到上一個頁面傳遞過來的Intent。因為我們需要的資料在它的"MessageKey房間"裡面。

第二步:從Intent中取出資料

第三步:獲取到文字框TextView的物件

第四步:將從Intent中取出的內容顯示到將文字框TextView上

按照上面的步驟,編寫SecondActivity.java中的程式碼:

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        //第一步 通過getIntent()方法獲取從第一個頁面傳遞過來的Intent
        Intent intent = getIntent();
        //根據上一個頁面協商好的“房間號”從Intent中取出資料
        String message = intent.getStringExtra("MessageKey");
        //第三步:通過findViewById()方法獲取到文字框TextView的物件
        TextView tv_info = (TextView) findViewById(R.id.tv_info);
        //第四步:將從Intent中取出的內容顯示到將文字框TextView上
        tv_info.setText(message);
    }

}
好了,現在我們看看APP執行效果:

第一個頁面的資料已經成功地傳遞到第二個頁面並且顯示。

特別注意

在這個專案中,我們在建立第二個Activity頁面檔案的時候,是通過Android studio提供的New -> Activity -> Blank Activity來完成的,這其中系統幫我們做了很多的工作,比如說,建立SecondActivity.java檔案、建立layout佈局資原始檔、另外還有最重要也是我們新手最容易忽略的一點 : 向專案配置檔案AndroidManifest.xml中註冊我們新建立的Activity頁面元件! 現在,AndroidManifest.xml的內容如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jim.myfirstproject" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MyActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SecondActivity"
            android:label="@string/title_activity_second"
            >
        </activity>
    </application>

</manifest>
其中的
<activity
            android:name=".SecondActivity"
            android:label="@string/title_activity_second"
            >
        </activity>
部分是我們通過New -> Activity -> Blank Activity建立SecondActivity頁面的時候系統幫我們註冊的。而且我們專案中用到的每一個Activity都必須在這個檔案中註冊,否則在我們跳轉頁面的時候,系統將無法找到我們的Activity。現在我們刪除掉系統幫我們的註冊資訊,再執行APP,會出現如下錯誤:

再次提示:專案中用到的每一個Activity都必須在AndroidManifest.xml檔案中註冊

原始碼下載