在完成上節課後,你有了能夠顯示包含一個文字輸入框和一個按鈕的activity(一個屏幕)的應用。在這節課中,你將在「MainActivity」類中添加一些代碼,使得在用戶點擊「Send」按鈕時,啓動另一個新的activity。(譯者注:activity可能能夠翻譯成「活動」,可是由於是安卓開發的專業術語,就不翻譯了。)。html
要響應此按鈕的「on-click」事件(event),打開「fragment_main.xml」佈局文件,而後在「<Button>」節點內添加「android:onClick」屬性。
java
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_send" android:onClick="sendMessage" />
「android:onClick」屬性的值,「sendMessage」,是當用戶點擊按鈕時系統將會調用的你的activity中的一個方法(method)。
android
打開「MainActivity」類(在項目中的「src/」目錄下),而後添加相應的方法:編程
/** Called when the user clicks the Send button */ public void sendMessage(View view) { // Do something in response to button }
爲了是系統能夠匹配此方法和「android:onClick」所指定的方法名,方法簽名(signature)必須如上所示。更明確的說,此方法必須:
app
下一步,你將讀取文字輸入項中的內容,而且發送讀取的文本到另外一個activity。
佈局
「Intent」(意圖)是提供運行時綁定不一樣構件(好比,兩個activities)的對象。「Intent」表述一個應用「意圖去作某件事」。你能夠用「Intent」實現各類各樣的任務,可是最常常的是用來啓動另外一個activity。
學習
在「sendMessage()」方法內部,建立一個啓動名爲「DisplayMessageActivity」的activity的「Intent」:
Intent intent = new Intent(this, DisplayMessageActivity.class);
這須要你導入(import)「Intent」類:
import android.content.Intent;
提示:在Eclipse中,同時按下「Ctrl + Shift + O」能夠自動導入缺失的類(在Mac中是「Cmd + Shift +O」)。
此處用到的構造函數(constructor)須要兩個參數(parameters):
第一個參數爲一個「Context」類型的對象(這裏使用了「this」對象,由於「Activity」類是「Context」類的子類)
以及須要系統將此「Intent」遞送的到的應用構件(component)的類(Class)(此例中爲要啓動的activity的類)
注意:若是你在使用Eclipse或者其餘的集成開發環境,引用「DisplayMessageActivity」到致使一個錯誤提示,由於這個類還不存在。目前,先忽略這個錯誤;你將很快創建此類。
一個「Intent」不只可以讓你啓動一個「activity」,他同時還能夠攜帶數據集(bundle)到另外一個「activity」。在「sendMessage()」方法內,使用「findViewById()」方法獲取「EditText」對象,而後把它的文本值添加到intent中:
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);
注意:如今,你須要導入「android.widget.EditText」類。你很快會定義「EXTRA_MESSAGE」常量。
一個「Intent」能夠經過一組叫作「extras」(額外數據)的鍵值對(key-value pairs)來攜帶多種類型的數據。「putExtra()」方法接收第一個參數做爲鍵值,第二個參數爲對應的數據值。
爲了使其餘的activity能夠查詢這些額外數據(extra data),你應該使用一個公有常量(public constant)來定義此intent的鍵值。所以,在「MainActivity」類的最開始,添加「EXTRA_MESSAGE」的定義:
public class MainActivity extends ActionBarActivity { public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"; ... }
通常來講,使用你的應用的包名稱做爲intent額外數據(extra)的鍵值前綴是一個好的習慣作法。若是你的應用要和其餘應用交互,這樣能夠保證他們是惟一的。
給其餘應用發送intent
咱們此節課建立的intent叫作「顯式intent」(explicit intent),由於這個「Intent」指定了須要發送到的應用構件(app component)。同時,intend也能夠是「隱式」的(implicit),此類「Intent」不會指定一個肯定的構件(component),可是容許安裝在當前設備上的任何應用響應此intent,只要它們能夠知足在「Intent」的不一樣參數中指定的各類元數據規範(meta-data specification)。更多的信息,請參閱課程「Interacting with Other Apps」。
要啓動一個activity,調用「startActivity()」方法而且傳入你的「Intent」做爲參數。系統接收到這個調用後,會啓動一個在此「Intent」中指定的「Activity」的實例(instance)。
隨着新的代碼加入,完整的「sendMessage()」方法以下,此方法將被「Send」按鈕調用:
/** 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); }
爲了使之工做,如今,你須要建立「DisplayMessageActivity」類。
在Eclipse中建立一個新的activity:
點擊工具欄上的「New」。
在所顯示的窗口中,打開「Android」目錄,而後選擇「Android Activity」。點擊「Next」。
選擇「BlankActivity」而後點擊「Next」。
填入activity的詳細信息:
Project(項目):MyFirstApp
Activity Name(activity名稱):DisplayMessageActivity
Layout Name(佈局名稱):activity_display_message
Fragment Layout Name(「碎片」名稱:譯者注:「碎片」是Android的新特性,之後將會介紹):fragment_display_message
Title(標題):My Message
Hierarchial Parent(層次關係中的父構件):com.example.myfirstapp.MainActivity
Navigation Type(導航類型):None
點擊「Finish」。
圖示1:Eclipse中的新建activity嚮導
若是你在使用其餘的IDE或者命令行工具,在項目的「src/」目錄中,建立一個名爲「DisplayMessageActivity.java」的文件,使之與已存在的「MainActivity.java」在一塊兒。
打開「DisplayMessageActivity.java」文件。若是你是使用Eclipse建立的:
這個類已經包含了一個「onCreate()」方法的實現。你隨後將更新這個方法的實現。
其中還有一個「onCreateOptionsMenu()」方法的實現,可是在此應用中,你不須要它。因此你能夠刪除它。
其中還有一個「onOptionsItemSelected()」方法的實現,此方法處理操做欄(action bar)中的「向上」(Up)行爲。保留原樣。
其中還有一個繼承自「Fragment」的「PlaceholderFragment」類。在此activity的最終版本中,你不須要這個類。
「Fragments」(碎片,這個也是Android的專用名詞,之後將不翻譯)能夠將應用的功能和用戶界面(UI)分解爲可重用的模塊。須要「fragment」的更多信息,請參閱「Fragments API Guide」。此activity的最終版本將不使用fragment。
如今的「DisplayMessageActivity」類應該以下:
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; } } }
若是你使用Eclipse以外的其餘IDE,使用上述代碼更新「DisplayMessageActivity」類。
全部「Activity」的子類必須實現「onCreate()」方法。當系統建立一個此activity的新實例的時候,將調用此方法。這個方法就是你使用「setContentView()」方法定義activity佈局和爲activity的各個構件(components)初始化設置(initial setup)的地方。
注意:若是你使用Eclipse以外的IDE,你的項目沒有「setContentView()」所需的「activity_display_message」佈局文件。由於你隨後會更新此方法清且不會使用此佈局,因此這不會成爲問題。
若是你使用Eclipse,你能夠直接跳到下一章節,由於建立activity模板爲新的activity提供了標題字符串。
若是你使用Eclipse以外的IDE,在「strings.xml」文件中添加新activity的標題:
<resources> ... <string name="title_activity_display_message">My Message</string> </resources>
全部的activity必須使用「<activity>」元素在「AndroidManifest.xml」文件中聲明。(譯者注:manifest在Java以及Android編程中都是經常使用的術語,此類文件通常是用來對資源和代碼進行說明和描述。)
若是你使用Eclipse建立此activity,它會建立一個缺省項。若是你使用其餘IDE,你須要本身添加此manifest項。它應該以下:
<application ... > ... <activity android:name="com.example.myfirstapp.DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName="com.example.myfirstapp.MainActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> </application>
「android:parentActivityName」屬性聲明此activity在應用的邏輯繼承關係上的父activity。系統經過這個值來實現缺省的導航行爲,好比在Android 4.1(API level 16)以及更新版本中的「向上導航」(Up navigation)。你可使用「Support Library」(兼容支持類庫,譯者注:這個類庫提供了讓舊版本的Android支持新的功能的一系列幫助類和方法)而且添加如上所示的「<meta-data>」元素的方法在舊版Android中提供一樣的導航行爲。
注意:你的Adroid SDK應該已經包含了最新版本的Adroid Support Library。它包含在ADT捆版軟件包中,可是若是你使用其餘IDE,你應該已經在「Adding Platforms and Packages」這個步驟安裝了它。當使用Eclipse的模板時,「Support Library」會自動被添加到你的項目中(你能夠在「Android Dependencies」列表中看到此類庫的jar文件)。若是你不使用Eclipse,你須要手動添加此類庫到你的項目中——跟隨「setting up the Support Library」嚮導去作,而後返回這裏。
若是你使用Eclipse開發,你如今能夠運行這個應用,但不會有什麼特別的發生。點擊「Send」按鈕,能夠啓動第二個activity,可是這個activity使用建立模板中提供的缺省「Hello World」佈局。你將很快更新這個activity使用一個自定義的文本視圖組件(text view)來取而代之,因此,若是你使用其餘IDE,不要擔憂這個應用還不能被編譯經過。
每一個Activity都是被一個Intent所調用的,無論用戶是如何被導航到那裏的。你能夠調用「getIntent()」方法來得到啓動你的activity的Intent,而後獲取包含於之中的數據。
在「DisplayMessageActivity」類的「onCreate()」方法中,獲取這個intent而且讀取「MainActivity」發送的消息。
Intent intent = getIntent(); String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
要在屏幕上顯示這則消息,須要建立一個「TextView」部件(widget)而後經過「setText()」方法設置它的顯示文字。所以,經過「setContentView()」方法,將「TextView」添加到佈局中做爲activity的根視圖元素。
完整的「DisplayMessageActivity」的「onCreate()」方法以下:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get the message from the intent Intent intent = getIntent(); String message = intent.getStringExtra(MainActivity.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); }
你在你能夠運行應用了。當它開啓,在文本輸入項中鍵入一條消息,點擊「Send」按鈕,以後,這條消息將顯示在第二個activity中。
圖示2:在Android 4.4中,完成版應用中的兩個activity。
如是,你已經完成了你的第一個Android應用(app)!
想學習更多,請跟隨連接到下一課程。
此文章總體或部分翻譯自Android Open Source Project的文檔。依照Creative Commons 2.5 Attribution License使用並分享。此文章(譯文,中文)原始連接爲「[安卓教學] 建立你的第一個安卓應用 - 第四課 - 啓動另一個activity」。原文(英文)連接爲「Starting Another Activity」。
< 上一課 | 課程介紹 | 下一課 > |