從零學Android(三)、Activity頁面的跳轉
在前面的學習中,我們已經建立好了一個擁有一個文字域和一個按鈕的Activity。今天的學習任務就是在MyActivity中加入一些程式碼,當用戶點選按鈕的時候跳轉到另外一個Activity頁面。
按鈕的響應事件
要實現上面的功能,我們首先需要做的就是學習怎麼去響應按鈕的點選事件。
第一步:開啟我們的activity_my.xml,然後給Button加入android:onClick屬性,顧名思義,“onClick”的含義就是“當點選時”,這個屬性對應的屬性值就是一個在對應的Activity頁面程式碼中的一個方法名稱,當用戶點選按鈕的時候,Android系統會幫我們執行這個方法。
第二步:在MyActivity.java檔案中新增sendMessage()方法,當按鈕被點選時,彈出一個Toast提示。<Button android:id="@+id/btn_send" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/btn_send" android:onClick="sendMessage"/>
/** * 點選"傳送"按鈕的回撥方法 * 注意:這個方法必須是 * 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,
注意:所有的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:textSize和android: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檔案中註冊