[Android] 開啟新的 Activity

在這篇文章中,我們示範如何在 Android app 中開啟另一個 activity,以及如何傳資料到另一個 activity 中
話不多說,實際用一個影片來示範如何完成這個功能,相關程式碼請參考底下文章的說明。






底下是第一個主畫面的程式碼,其中 public void newActivity(View view) 是按鈕點擊的事件處理函數
package com.example.justim.myapplication;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void newActivity(View view) {
/*Intent (意圖) 這個類別是 Android 用來啟動另一個 activity 或是 service 的機制。
它代表了程式設計師想要做的一個 "工作"。
在這個例子中,我們在 Intent 中包含了兩個資訊,這個資訊透過下一行的 setClass 函式設定給 Intent 類別
第一個資訊是 "誰" 要開啟新的 activity (這個誰,就是 this,也就是代表主畫面本身)
第二個資訊是 "什麼東西" 要被開啟。在本例中,就是 Main2Activity 要被開啟。
Intent 的詳細資訊,可以參考 Android 的線上文件:
https://developer.android.com/reference/android/content/Intent.html (英文)
https://developer.android.com/guide/components/intents-filters.html (中文)
*/
Intent intent = new Intent();
intent.setClass(this, Main2Activity.class);
startActivity(intent);
}
}
第一個主畫面

底下是第一個主畫面的 layout 檔案
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.justim.myapplication.MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Activity"
android:id="@+id/btnNew"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:onClick="newActivity" />
</RelativeLayout>

底下是第二個畫面的程碼
package com.example.justim.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
}
}

第二個畫面

底下是第二個畫面的 layout 檔案
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.justim.myapplication.Main2Activity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="This is activity 2"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>

如何由第一個畫面,傳遞資料給第二個畫面 


如果想由第一個畫面,傳遞資料給第2個畫面,修改 MainActivity.java 中的 newActivity 函式即可 。相關程式碼如下
public void newActivity(View view) {
/*Intent (意圖) 這個類別是 Android 用來啟動另一個 activity 或是 service 的機制。
它代表了程式設計師想要做的一個 "工作"。
在這個例子中,我們在 Intent 中包含了兩個資訊,這個資訊透過下一行的 setClass 函式設定給 Intent 類別
第一個資訊是 "誰" 要開啟新的 activity (這個誰,就是 this,也就是代表主畫面本身)
第二個資訊是 "什麼東西" 要被開啟。在本例中,就是 Main2Activity 要被開啟。
Intent 的詳細資訊,可以參考 Android 的線上文件:
https://developer.android.com/reference/android/content/Intent.html (英文)
https://developer.android.com/guide/components/intents-filters.html (中文)
*/
Intent intent = new Intent();
intent.setClass(this, Main2Activity.class);
/*在 原本程式碼中的 newActivity 中加入底下三行*/
Bundle bundle = new Bundle(); //建構一個 bundle (公事包),裏面可以儲存所要傳遞的資訊
bundle.putString("name", "Peter"); //在 bundle 中加入一個字串 "Peter",這個字串的名字是 "name"
intent.putExtras(bundle); //將 bundle 加入 intent 中
startActivity(intent);
}

第二個畫面在 onCreate 中也要修改程式碼,用來接收 MainActivity 所傳來的字串 (實際示範請見影片9:00之後的片段)。相關程式碼如下
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//加入底下的程式碼,其用來取得 MainActivity.java 中所傳來的字串資料
Bundle bundle = getIntent().getExtras(); //由 intent 中取出 bundle
String name = bundle.getString("name"); //由 bundle 中取出名為 name 的字串
TextView tvName = (TextView)findViewById(R.id.tvName);
tvName.setText(name);
}

留言

這個網誌中的熱門文章

由 Pandas 的 DataFrame 中取得資料

[程式設計] C++ 的字串切割

[程式設計] UVa 介紹,以及 UDebug 和其他輔助工具的介紹