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

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