注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術(shù)一般,由于喜愛安卓而產(chǎn)生了翻譯的念頭,純屬個人興趣愛好。
原文鏈接: http://developer.android.com/training/basics/firstapp/starting-activity.html
?一. 啟動另一個Activity
在完成了之前的課程后,你已經(jīng)擁有了一個顯示一個Activity(即只有一個屏幕畫面)的應(yīng)用,在這個Activity中有一個文本框和一個按鈕。在這節(jié)課上,你將在 MainActivity 中添加一些新的代碼,這些代碼將實現(xiàn):當(dāng)用戶點擊按鈕后,可以啟動一個新的Activity。
?
一). 發(fā)送按鈕的響應(yīng)
為了響應(yīng)按鈕點擊事件,打開布局文件
activity_main.xml
,在
<Button>
標(biāo)簽中,添加
android:onClick
這一屬性字段:
< Button android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:text ="@string/button_send" android:onClick ="sendMessage" />
android:onClick 的值為“ sendMessage ”,它在你的 Activity 中的一個方法的名字,當(dāng)用戶點擊這個按鈕時,系統(tǒng)會調(diào)用這個方法。
打開 MainActivity 類(在項目工程的 /src 目錄下),然后添加響應(yīng)的方法:
/** Called when the user clicks the Send button */ public void sendMessage(View view) { // Do something in response to button }
這需要你導(dǎo)入 View 類:
import
android.view.View;
Tip:
在Eclipse中,按下“ Ctrl + Shift + O ”可以自動導(dǎo)入丟失的類(在Mac上的組合鍵是:“ Cmd + Shift + O ”)。
為了讓系統(tǒng)能夠?qū)⑦@個方法和它在 android:onClick 屬性字段中的方法名這兩者相互關(guān)聯(lián)起來,這個方法的特征必須嚴(yán)格地像上述所表示的那樣,具體來說,方法的特征有如下幾點:
- 必須是 Public
- 返回值為 void
- 只有一個形參 View (這個 View 就是被點擊的 View )
接下來,你將會實現(xiàn)這個方法,我們用它來讀取文本框中的內(nèi)容并且將文字發(fā)送給另一個 Activity
?
二). 構(gòu)建一個Intent
Intent 是一種對象,它是在運行時將兩個獨立的組件(比如兩個 Activity )聯(lián)系起來的紐帶。 Intent 代表了一個應(yīng)用的某種“意圖”,你可以使用Intent去完成很多事情,但通常他們被用來啟動另一個Activity。
在 sendMessage() 這一方法中,創(chuàng)建一個新的 Intent 來啟動另一個稱之為 DisplayMessageActivity 的Activity:
Intent intent = new Intent( this , DisplayMessageActivity. class );
這里的構(gòu)造函數(shù)包含了兩個參數(shù):
- 一個 Context 作為第一個參數(shù)(這里用 this 的原因是 Activity 是 Context 的一個子類)。
-
應(yīng)用組件中的某個
Class ,它是系統(tǒng)送達(dá) Intent 的目標(biāo)(在此例中,對應(yīng)的是將要被啟動的 Activity )
Note:
若你正在使用的是一個集成開發(fā)環(huán)境(IDE),如:Eclipse,那么對 DisplayMessageActivity 的引用將會引起一個錯誤,原因是目前這個類還并不存在。我們現(xiàn)在先暫且忽略這個錯誤,你馬上就將創(chuàng)建這個類。
一個
Intent
不僅僅只能允許你啟動另一個
Activity
,它還能附帶有一些數(shù)據(jù)給這個
Activity
,在
sendMessage()
這一方法中,使用
findViewById()
這個方法來獲取
EditText
控件,并把它的內(nèi)容交給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);
Note:
你現(xiàn)在需要導(dǎo)入一些聲明: android.content.Intent 和
android.widget.EditText 。稍后你將會定義 EXTRA_MESSAGE 常量。
將Intent發(fā)送給其他應(yīng)用:
這節(jié)課中所創(chuàng)建的 Intent ,我們將它稱之為“顯式的 Intent ”,因為這個
Intent 指明了自己將會發(fā)送給哪一個特定的應(yīng)用組件。然而, Intent 也可以是 “ 隱式的 ”,在這種情況下, Intent 不指明自己期望被發(fā)送到哪個組件,但允許任何安裝在設(shè)備上的應(yīng)用響應(yīng)這個 Intent ,只要它的行為的元數(shù)據(jù)規(guī)格與之相匹配,可以通過閱讀 : Interacting with Other Apps 獲得更多信息。
一個
Intent
攜帶以鍵值對形式存放的各種數(shù)據(jù)類型,在
Intent
中這些鍵值對被稱之為
extras
,
putExtra()
方法中第一個參數(shù)對應(yīng)于鍵,第二個參數(shù)對應(yīng)于值。
為了讓下一個
Activity
可以查詢
extras
的數(shù)據(jù),你應(yīng)該使用一個公共常量來定義
Intent
的
extras
中的鍵。所以在
MainActivity
類的頂端,添加
EXTRA_MESSAGE
的定義:
public class MainActivity extends Activity { public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE" ; ... }
為 Intent extras 的鍵定義時,將你應(yīng)用的包名作為前綴是一個好的習(xí)慣,這樣可以保證他們是唯一的,這有助于你的應(yīng)用和其他應(yīng)用進(jìn)行通信。
?
三). 啟動第二個Activity
為了啟動一個
Activity
,調(diào)用
startActivity()
方法,并且將你的
Intent
對象傳遞給它。之后系統(tǒng)接受到函數(shù)的調(diào)用,并且啟動一個被
Intent
所指定的
Activity
實例。
加上了新的代碼后,被Send按鈕所調(diào)用的 sendMessage() 方法的完整代碼如下所示:
/** 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); }
現(xiàn)在你需要創(chuàng)建 DisplayMessageActivity 類使得它能夠正確運行。
?
四). 創(chuàng)建第二個Activity
使用Eclipse創(chuàng)建第二個類:
- 在工具欄中點擊“ New ”
- 在出現(xiàn)的窗口中,打開 “ Android ”文件夾,選擇 “ Android Activity ”,點擊 “ Next ”
- 選擇 “ BlankActivity ” , 點擊 “ Next ”
- 填寫Activity的細(xì)節(jié)信息:
-
- Project : MyFirstApp
- Activity Name : DisplayMessageActivity
- Layout Name : activity_display_message
- Title : My Message
- Hierarchial Parent : com.example.myfirstapp.MainActivity
- Navigation Type : None
點擊 Finish
圖1. Eclipse中創(chuàng)建新Activity的向?qū)?
如果你使用的是不同的IDE,或者是命令行,在項目工程中的 “ src/ ”創(chuàng)建一個新的名為“ DisplayMessageActivity.java ”的文件,這個文件緊隨最初的 “ MainActivity.java ” 文件。
打開 “ DisplayMessageActivity.java ”,如果你使用的是Eclipse創(chuàng)建的它:
- 這個類已經(jīng)包含了一個必須的 onCreate() 方法的實現(xiàn)
-
同時還有
onCreateOptionsMenu() 方法的實現(xiàn),但在這個應(yīng)用中我們不需要它,所以你可以將它刪除
- 同時還有一個 onOptionsItemSelected() 方法的實現(xiàn),這個方法處理標(biāo)題欄( Action Bar )的處理上一頁( Up )事件時的行為。我們保持它原有的樣子。
因為
ActionBar
的APIs僅在
HONEYCOMB
(API Level 11)及更高的版本中才有,所以你必須在
getActionBar()
方法處添加一個條件判斷,用來檢查當(dāng)前的平臺版本。另外,你必須在
onCreate()
方法處添加一個標(biāo)簽:“
@SuppressLint("NewApi")
”,以此來避免
lint
錯誤。
現(xiàn)在, DisplayMessageActivity 看上去應(yīng)該是這樣的 :
public class DisplayMessageActivity extends Activity { @SuppressLint( "NewApi" ) @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_display_message); // Make sure we're running on Honeycomb or higher to use ActionBar APIs if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // Show the Up button in the action bar. getActionBar().setDisplayHomeAsUpEnabled( true ); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask( this ); return true ; } return super .onOptionsItemSelected(item); } }
如果你使用的IDE不是Eclipse,使用上述代碼更新你的 DisplayMessageActivity 類。
所有
Activity
的子類必須實現(xiàn)
onCreate()
方法。當(dāng)系統(tǒng)創(chuàng)建Activity的實例時,會調(diào)用這個方法。在這個方法中,你通過使用
setContentView()
方法定義
activity
的的布局,同時對
activity
的組件進(jìn)行初始化設(shè)置。
Note:
如果你使用的IDE不是Eclipse,你的項目工程將不會包括 setContentView() 所需要的布局文件 activity_display_message,這沒有關(guān)系,因為你馬上將會對這個方法進(jìn)行更新并且不再需要這個布局。
?
添加標(biāo)題字符
如果你使用的是Eclipse,你可以跳過這一節(jié),因為自動創(chuàng)建的模板為新的 activity 提供了標(biāo)題字符。
如果你使用的IDE不是Eclipse,在“ strings.xml ”添加新 activity 的標(biāo)題字符:
< resources > ... < string name ="title_activity_display_message" > My Message </ string > </ resources >
?
添加至清單
在你的清單文件
“
AndroidManifest.xml
”
中,所有
activity
必須通過使用一個
<activity>
標(biāo)簽
被聲明。
當(dāng)你使用Eclipse工具創(chuàng)建這個activity時,它會創(chuàng)建一個默認(rèn)的條目,如果你使用的不是Eclipse,你需要自己添加這個清單條目,修改后的結(jié)果如下:
< 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
屬性字段聲明了在應(yīng)用的邏輯結(jié)構(gòu)中該
activity
的父
activity的名字。系統(tǒng)使用這一屬性值來實現(xiàn)默認(rèn)的導(dǎo)航行為,比如在Android 4.1版本(API Level 16)或更高版本中的
Up navigation
行為。你可以為較舊版本的Android系統(tǒng)提供相同的導(dǎo)航行為,這可以通過使用
Support Library
并且添加
<meta-data>
標(biāo)簽來實現(xiàn),如同此例所示。
? Note:
你的Android SDK應(yīng)該已經(jīng)擁有了最新的 Android Support Library,它包含在ADT中。但如果你用的是其他的IDE,你應(yīng)該在 Adding Platforms and Packages 這一步中已經(jīng)將它安裝好。當(dāng)在Eclipse中使用模板時,Support Library就被自動地添加到你的項目中了(你可以在 Android Dependencies 下看到這個庫的JAR文件)。如果你使用的不是Eclipse,你需要手動將它添加至你的項目,按照如下導(dǎo)引一步步執(zhí)行即可: setting up the Support Library 。
如果你使用的是Eclipse,你現(xiàn)在已經(jīng)可以運行這個應(yīng)用了,但是沒有什么事情發(fā)生。點擊發(fā)送按鈕會啟動第二個 Activity ,但是它使用的是默認(rèn)的“ Hello World ”模板作為布局。你很快就將更新這個activity,使它顯示一個自定義的文本框,若你使用的是其他IDE,不用擔(dān)心目前自己應(yīng)用還無法編譯的問題。
?
?
五).?接受Intent
無論用戶是如何被指引到那兒的,每個 Activity 都是被一個 Intent 啟動的。你可以通過調(diào)用 getIntent() 方法來獲得啟動你的 activity 的 Intent ,進(jìn)而收回它所攜帶的數(shù)據(jù)。
在 DisplayMessageActivity 類中的的 onCreate() 方法里,提取由 MainActivity發(fā)送的數(shù)據(jù):
Intent intent =
getIntent();
String message
= intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
?
六). 顯示消息
為了在屏幕上顯示消息,創(chuàng)建一個 TextView 控件,然后使用 setText() 方法設(shè)置它要顯示的文本。之后將 TextView 傳遞給 setContentView() ,這樣 TextView 就成為了這個activity的根View。
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); }
現(xiàn)在你可以運行這個應(yīng)用。當(dāng)它打開后,在文本框里輸入一些文字,點擊發(fā)送,然后這些文字將會在第二個 activity 中顯示出來。
圖2. 在Android4.0設(shè)備上的運行結(jié)果
?
就是這樣,你已經(jīng)構(gòu)建好了你的第一個應(yīng)用了!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
