W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
編寫(xiě):yuanfentiank789 - 原文:http://developer.android.com/training/basics/firstapp/starting-activity.html
在完成上一課(建立簡(jiǎn)單的用戶界面)后,我們已經(jīng)擁有了顯示一個(gè)activity(一個(gè)界面)的app(應(yīng)用),該activity包含了一個(gè)文本字段和一個(gè)按鈕。在這節(jié)課中,我們將添加一些新的代碼到MyActivity
中,當(dāng)用戶點(diǎn)擊發(fā)送(Send)按鈕時(shí)啟動(dòng)一個(gè)新的activity。
1 在Android Studio中打開(kāi)res/layout目錄下的content_my.xml 文件.
2 為 Button 標(biāo)簽添加android:onclick屬性.
res/layout/content_my.xml
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send"
android:onClick="sendMessage" />
android:onclick
屬性的值"sendMessage"
即為用戶點(diǎn)擊屏幕按鈕時(shí)觸發(fā)方法的名字。
3 打開(kāi)java/com.mycompany.myfirstapp目錄下MyActivity.java 文件.
4 在MyActivity.java 中添加sendMessage() 函數(shù):
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
}
為使系統(tǒng)能夠?qū)⒃摲椒ǎ銊傇贛yActivity.java中添加的sendMessage方法)與在android:onClick
屬性中提供的方法名字匹配,它們的名字必須一致,特別需要注意的是,這個(gè)方法必須滿足以下條件:
接下來(lái),你可以在這個(gè)方法中編寫(xiě)讀取文本內(nèi)容,并將該內(nèi)容傳到另一個(gè)Activity的代碼。
Intent是在不同組件中(比如兩個(gè)Activity)提供運(yùn)行時(shí)綁定的對(duì)象。
Intent
代表一個(gè)應(yīng)用"想去做什么事",你可以用它做各種各樣的任務(wù),不過(guò)大部分的時(shí)候他們被用來(lái)啟動(dòng)另一個(gè)Activity。更詳細(xì)的內(nèi)容可以參考Intents and Intent Filters。
1 在MyActivity.java的sendMessage()
方法中創(chuàng)建一個(gè)Intent
并啟動(dòng)名為DisplayMessageActivity
的Activity:
java/com.mycompany.myfirstapp/MyActivity.java
Intent intent = new Intent(this, DisplayMessageActivity.class);
Note:如果使用的是類(lèi)似Android Studio的IDE,這里對(duì)
DisplayMessageActivity
的引用會(huì)報(bào)錯(cuò),因?yàn)檫@個(gè)類(lèi)還不存在;暫時(shí)先忽略這個(gè)錯(cuò)誤,我們很快就要去創(chuàng)建這個(gè)類(lèi)了。
在這個(gè)Intent構(gòu)造函數(shù)中有兩個(gè)參數(shù):
第一個(gè)參數(shù)是Context(之所以用this
是因?yàn)楫?dāng)前Activity是Context
的子類(lèi))
接受系統(tǒng)發(fā)送Intent的應(yīng)用組件的Class(在這個(gè)案例中,指將要被啟動(dòng)的activity)。
Android Studio會(huì)提示導(dǎo)入Intent類(lèi)。
2 在文件開(kāi)始處導(dǎo)入Intent類(lèi):
java/com.mycompany.myfirstapp/MyActivity.java
import android.content.Intent;
Tip:在Android Studio中,按Alt + Enter 可以導(dǎo)入缺失的類(lèi)(在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 在文件開(kāi)始處導(dǎo)入EditText類(lèi).
在Android Studio中,按Alt + Enter 可以導(dǎo)入缺失的類(lèi)(在Mac中使用option + return)
5 把EditText的文本內(nèi)容關(guān)聯(lián)到一個(gè)本地 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 的鍵-值對(duì)數(shù)據(jù)類(lèi)型。 putExtra()方法把鍵名作為第一個(gè)參數(shù),把值作為第二個(gè)參數(shù)。
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";
...
}
為讓新啟動(dòng)的activity能查詢extra數(shù)據(jù)。定義key為一個(gè)public型的常量,通常使用應(yīng)用程序包名作為前綴來(lái)定義鍵是很好的做法,這樣在應(yīng)用程序與其他應(yīng)用程序進(jìn)行交互時(shí)仍可以確保鍵是唯一的。
7 在sendMessage()函數(shù)里,調(diào)用startActivity()完成新activity的啟動(dòng),現(xiàn)在完整的代碼應(yīng)該是下面這個(gè)樣子:
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);
}
運(yùn)行這個(gè)方法,系統(tǒng)收到我們的請(qǐng)求后會(huì)實(shí)例化在Intent
中指定的Activity
,現(xiàn)在需要?jiǎng)?chuàng)建一個(gè)DisplayMessageActivity
類(lèi)使程序能夠執(zhí)行起來(lái)。
Activity所有子類(lèi)都必須實(shí)現(xiàn)onCreate()方法。創(chuàng)建activity的實(shí)例時(shí)系統(tǒng)會(huì)調(diào)用該方式,此時(shí)必須用 setContentView()來(lái)定義Activity布局,以對(duì)Activity進(jìn)行初始化。
使用Android Studio創(chuàng)建的activity會(huì)實(shí)現(xiàn)一個(gè)默認(rèn)的onCreate()方法.
在Android Studio的java 目錄, 選擇包名 com.mycompany.myfirstapp,右鍵選擇 New > Activity > Blank Activity.
在Choose options窗口,配置activity:
Package name: com.mycompany.myfirstapp 點(diǎn)擊 Finish.
3 打開(kāi)DisplayMessageActivity.java文件,此類(lèi)已經(jīng)實(shí)現(xiàn)了onCreate()方法,稍后需要更新此方法。
如果使用 Android Studio開(kāi)發(fā),現(xiàn)在已經(jīng)可以點(diǎn)擊Send按鈕啟動(dòng)這個(gè)activity了,但顯示的仍然是模板提供的默認(rèn)內(nèi)容"Hello world",稍后修改顯示自定義的文本內(nèi)容。
如果使用命令行工具創(chuàng)建activity,按如下步驟操作:
1 在工程的src/目錄下,緊挨著MyActivity.java創(chuàng)建一個(gè)新文件DisplayMessageActivity.java.
2 寫(xiě)入如下代碼:
public class DisplayMessageActivity extends AppCompatActivity {
@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,工程中可能不會(huì)包含由
setContentView()
請(qǐng)求的activity_display_message
layout,但這沒(méi)關(guān)系,因?yàn)榈认聲?huì)修改這個(gè)方法。
3 把新Activity的標(biāo)題添加到strings.xml文件:
<resources>
...
<string name="title_activity_display_message">My Message</string>
</resources>
4 在 AndroidManifest.xml的Application 標(biāo)簽內(nèi)為 DisplayMessageActivity添加 標(biāo)簽,如下:
<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
屬性聲明了在應(yīng)用程序中該Activity邏輯層面的父類(lèi)Activity的名稱。 系統(tǒng)使用此值來(lái)實(shí)現(xiàn)默認(rèn)導(dǎo)航操作,比如在Android 4.1(API level 16)或者更高版本中的Up navigation。 使用Support Library,如上所示的<meta-data>
元素可以為安卓舊版本提供相同功能。
Note:我們的Android SDK應(yīng)該已經(jīng)包含了最新的Android Support Library,它包含在ADT插件中。但如果用的是別的IDE,則需要在 Adding Platforms and Packages 中安裝。當(dāng)Android Studio中使用模板時(shí),Support Library會(huì)自動(dòng)加入我們的工程中(在Android Dependencies中你以看到相應(yīng)的JAR文件)。如果不使用Android Studio,就需要手動(dòng)將Support Library添加到我們的工程中,參考setting up the Support Library。
不管用戶導(dǎo)航到哪,每個(gè)Activity都是通過(guò)Intent被調(diào)用的。我們可以通過(guò)調(diào)用getIntent()來(lái)獲取啟動(dòng)activity的Intent及其包含的數(shù)據(jù)。
1 編輯java/com.mycompany.myfirstapp目錄下的DisplayMessageActivity.java文件.
2 得到intent 并賦值給本地變量.
Intent intent = getIntent();
3 為Intent導(dǎo)入包.
在Android Studio中,按Alt + Enter 可以導(dǎo)入缺失的類(lèi)(在Mac中使用option + return).
4 調(diào)用 getStringExtra()提取從 MyActivity 傳遞過(guò)來(lái)的消息.
String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);
1 在res/layout目錄下,編輯文件content_display_message.xml
.
2 為標(biāo)簽添加id屬性,你之后需要用這個(gè)id屬性來(lái)調(diào)用這個(gè)對(duì)象.
< RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
android:id="@+id/content">
</RelativeLayout>
3 重新來(lái)編輯DisplayMessageActivity.java
4 在onCreate()
方法中創(chuàng)建一個(gè)對(duì)象TextView
TextView textView = new TextView(this);
5 用setText()
來(lái)設(shè)置文本字體大小和內(nèi)容.
textView.setTextSize(40);
textView.setText(message);
6 將TextView
加入之前被標(biāo)記為R.id.content
的RelativeLayout
中
RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
layout.addView(textView);
7 為T(mén)extView 導(dǎo)入包.
在Android Studio中,按Alt + Enter 可以導(dǎo)入缺失的類(lèi)(在Mac中使用option + return).
DisplayMessageActivity的完整onCreate()方法應(yīng)該如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null)
.show();
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Intent intent = getIntent();
String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);
RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);
layout.addView(textView);
}
現(xiàn)在你可以運(yùn)行app,在文本中輸入信息,點(diǎn)擊Send(發(fā)送)按鈕,ok,現(xiàn)在就可以在第二Activity上看到發(fā)送過(guò)來(lái)信息了。如圖:
到此為止,已經(jīng)創(chuàng)建好我們的第一個(gè)Android應(yīng)用了!
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: