Android學習筆記之啓動另一個 Activity

在這節課中,學習當用戶點擊發送 (Send) 按鈕時啓動一個新的 activity。

響應 Send (發送) 按鈕

1 在 Android Studio 中打開 res/layout 目錄下的 activity_my.xml 文件.

2 爲 Button 標籤添加 android:onclick 屬性.

res/layout/activity_my.xml

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />

android:onclick 屬性的值 "sendMessage" 即爲用戶點擊屏幕按鈕時觸發方法的名字。

3 打開 java/com.mycompany.myfirstapp 目錄下 MyActivity.java 文件.

4 在 MyActivity.java 中添加 sendMessage () 函數:

java/com.mycompany.myfirstapp/MyActivity.java

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    // Do something in response to button
}

爲使系統能夠將該方法(你剛在 MyActivity.java 中添加的 sendMessage 方法)與在 android:onClick 屬性中提供的方法名字匹配,它們的名字必須一致,特別需要注意的是,這個方法必須滿足以下條件:

  • 是 public 函數
  • 無返回值
  • 參數唯一 (爲 View 類型,代表被點擊的視圖)

接下來,你可以在這個方法中編寫讀取文本內容,並將該內容傳到另一個 Activity 的代碼。

構建一個 Intent

Intent 是在不同組件中 (比如兩個 Activity) 提供運行時綁定的對象。Intent 代表一個應用 "想去做什麼事",你可以用它做各種各樣的任務,不過大部分的時候他們被用來啓動另一個 Activity。更詳細的內容可以參考 Intents and Intent Filters

1 在 MyActivity.java 的 sendMessage() 方法中創建一個 Intent 並啓動名爲 DisplayMessageActivity 的 Activity:

java/com.mycompany.myfirstapp/MyActivity.java

Intent intent = new Intent(this, DisplayMessageActivity.class);

Note:如果使用的是類似 Android Studio 的 IDE,這裏對 DisplayMessageActivity 的引用會報錯,因爲這個類還不存在;暫時先忽略這個錯誤,我們很快就要去創建這個類了。

在這個 Intent 構造函數中有兩個參數:

  • 第一個參數是 Context(之所以用 this 是因爲當前 Activity 是 Context 的子類)

  • 接受系統發送 Intent 的應用組件的 Class(在這個案例中,指將要被啓動的 activity)。

Android Studio 會提示導入 Intent 類。

2 在文件開始處導入 Intent 類:

java/com.mycompany.myfirstapp/MyActivity.java

import android.content.Intent;

Tip: 在 Android Studio 中,按 Alt + Enter 可以導入缺失的類 (在 Mac 中使用 option + return)

3 在 sendMessage() 方法裏用 findViewById() 方法得到 EditText 元素.

java/com.mycompany.myfirstapp/MyActivity.java

public void sendMessage(View view) {
  Intent intent = new Intent(this, DisplayMessageActivity.class);
  EditText editText = (EditText) findViewById(R.id.edit_message);
}

4 在文件開始處導入 EditText 類.

在 Android Studio 中,按 Alt + Enter 可以導入缺失的類 (在 Mac 中使用 option + return)

5 把 EditText 的文本內容關聯到一個本地 message 變量,並使用 putExtra () 方法把值傳給 intent.

java/com.mycompany.myfirstapp/MyActivity.java

public void sendMessage(View view) {
  Intent intent = new Intent(this, DisplayMessageActivity.class);
  EditText editText = (EditText) findViewById(R.id.edit_message);
  String message = editText.getText().toString();
  intent.putExtra(EXTRA_MESSAGE, message);
}

Intent 可以攜帶稱作 extras 的鍵 - 值對數據類型。 putExtra() 方法把鍵名作爲第一個參數,把值作爲第二個參數。

6 在 MyActivity class, 定義 EXTRA_MESSAGE :

java/com.mycompany.myfirstapp/MyActivity.java

public class MyActivity extends ActionBarActivity {
    public final static String EXTRA_MESSAGE = "com.mycompany.myfirstapp.MESSAGE";
    ...
}

爲讓新啓動的 activity 能查詢 extra 數據。定義 key 爲一個 public 型的常量,通常使用應用程序包名作爲前綴來定義鍵是很好的做法,這樣在應用程序與其他應用程序進行交互時仍可以確保鍵是唯一的。

7 在 sendMessage () 函數裏,調用 startActivity () 完成新 activity 的啓動,現在完整的代碼應該是下面這個樣子:

java/com.mycompany.myfirstapp/MyActivity.java

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

運行這個方法,系統收到我們的請求後會實例化在 Intent 中指定的 Activity,現在需要創建一個 DisplayMessageActivity類使程序能夠執行起來。

創建第二個 Activity

Activity 所有子類都必須實現 onCreate () 方法。創建 activity 的實例時系統會調用該方式,此時必須用 setContentView () 來定義 Activity 佈局,以對 Activity 進行初始化。

使用 Android Studio 創建新的 Activity

使用 Android Studio 創建的 activity 會實現一個默認的 onCreate () 方法.

  1. 在 Android Studio 的 java 目錄,選擇包名 com.mycompany.myfirstapp, 右鍵選擇 New > Activity > Blank Activity.

  2. 在 Choose options 窗口,配置 activity:

    • Activity Name: DisplayMessageActivity
    • Layout Name: activity_display_message
    • Title: My Message
    • Hierarchical Parent: com.mycompany.myfirstapp.MyActivity
    • Package name: com.mycompany.myfirstapp

點擊 Finish.

adt-new-activity

3 打開 DisplayMessageActivity.java 文件,此類已經實現了 onCreate () 方法,稍後需要更新此方法。另外還有一個 onOptionsItemSelected () 方法,用來處理 action bar 的點擊行爲。暫時保留這兩個方法不變。

4 由於這個應用程序並不需要 onCreateOptionsMenu (),直接刪除這個方法。

如果使用 Android Studio 開發,現在已經可以點擊 Send 按鈕啓動這個 activity 了,但顯示的仍然是模板提供的默認內容 "Hello world",稍後修改顯示自定義的文本內容。

使用命令行創建 activity

如果使用命令行工具創建 activity,按如下步驟操作:

1 在工程的 src / 目錄下,緊挨着 MyActivity.java 創建一個新文件 DisplayMessageActivity.java.

2 寫入如下代碼:

public class DisplayMessageActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);
        if (savedInstanceState == null) {
            getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
        }
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);   
    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {
        public PlaceholderFragment() { }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                  Bundle savedInstanceState) {
              View rootView = inflater.inflate(R.layout.fragment_display_message,
                      container, false);
              return rootView;
        }
    }
}

Note: 如果使用的 IDE 不是 Android Studio,工程中可能不會包含由 setContentView() 請求的 activity_display_message layout,但這沒關係,因爲等下會修改這個方法。

3 把新 Activity 的標題添加到 strings.xml 文件:

<resources>
    ...
    <string name="title_activity_display_message">My Message</string>
</resources>

4 在 AndroidManifest.xml 的 Application 標籤內爲 DisplayMessageActivity 添加 <activity> 標籤,如下:

<application ... >
    ...
    <activity
        android:name="com.mycompany.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.mycompany.myfirstapp.MyActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.mycompany.myfirstapp.MyActivity" />
    </activity>
</application>

android:parentActivityName 屬性聲明瞭在應用程序中該 Activity 邏輯層面的父類 Activity 的名稱。 系統使用此值來實現默認導航操作,比如在 Android 4.1(API level 16)或者更高版本中的 Up navigation。 使用 Support Library,如上所示的 <meta-data>元素可以爲安卓舊版本提供相同功能。

Note: 我們的 Android SDK 應該已經包含了最新的 Android Support Library,它包含在 ADT 插件中。但如果用的是別的 IDE,則需要在 Adding Platforms and Packages 中安裝。當 Android Studio 中使用模板時,Support Library 會自動加入我們的工程中 (在 Android Dependencies 中你以看到相應的 JAR 文件)。如果不使用 Android Studio,就需要手動將 Support Library 添加到我們的工程中,參考 setting up the Support Library

接收 Intent

不管用戶導航到哪,每個 Activity 都是通過 Intent 被調用的。我們可以通過調用 getIntent() 來獲取啓動 activity 的 Intent 及其包含的數據。

1 編輯 java/com.mycompany.myfirstapp 目錄下的 DisplayMessageActivity.java 文件.

2 刪除 onCreate () 方法中下面一行:

  setContentView(R.layout.activity_display_message);

3 得到 intent 並賦值給本地變量.

Intent intent = getIntent();

4 爲 Intent 導入包.

在 Android Studio 中,按 Alt + Enter 可以導入缺失的類 (在 Mac 中使用 option + return).

5 調用 getStringExtra () 提取從 MyActivity 傳遞過來的消息.

String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);

顯示文本

1 在 onCreate () 方法中,創建一個 TextView 對象.

TextView textView = new TextView(this);

2 設置文本字體大小和內容.

textView.setTextSize(40);
textView.setText(message);

3 通過調用 activity 的 setContentView () 把 TextView 作爲 activity 佈局的根視圖.

setContentView(textView);

4 爲 TextView 導入包.

在 Android Studio 中,按 Alt + Enter 可以導入缺失的類 (在 Mac 中使用 option + return).

DisplayMessageActivity 的完整 onCreate () 方法應該如下:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);
    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);
    // Set the text view as the activity layout
    setContentView(textView);
}

現在你可以運行 app,在文本中輸入信息,點擊 Send (發送) 按鈕,ok,現在就可以在第二 Activity 上看到發送過來信息了。如圖:

firstapp

到此爲止,已經創建好我們的第一個 Android 應用了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章