啓動另一個Activityjava
在完成了上一節課的學習後,咱們已經建立了一個帶有text輸入框和一個button的app。android
在本課中,咱們將在MainActivity類中添加SendButton的單擊響應代碼以啓動另一個Activity。app
響應Send Button編輯器
爲了響應Send Button的單擊事件,咱們打開Activity_main.xml佈局文件,ide
而且爲<Button>元素添加android:onClick屬性:函數
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_send" android:onClick="sendMessage" />
android:onClick屬性的值:"sendMessage",是MainActivity的一個方法名,而且當用戶工具
單擊Send Button的時候會調用該方法。佈局
打開類MainActivity(在項目src目錄下),而後在該類中添加Send Button的響應方法:sendMessage。學習
/** Called when the user clicks the Send button */ public void sendMessage(View view) { // Do something in response to button }
若是使用的是Eclipse等相似的編輯器的話,在參數View的地方會提示錯誤的,爲了避免出現錯誤,須要先導入View類。ui
import android.view.View;
小提示:在Eclipse下可使用快捷鍵Ctrl+Shift+O組合鍵自動導入須要導入的類。(Mac系統下快捷組合鍵是:Cmd+Shift+O)
爲了系統可以將該方法和android:onClick事件綁定到一塊兒,該方法須要設置以下標誌位(修飾符?):
1.該方法須要爲Public類型
2.返回值類型須要爲void
3.View做爲惟一的參數(標識哪一個view的單擊事件)
創建一個Intent
Intent是一個對象,它可以將兩個分離的組件(好比兩個Activities)進行運行時綁定。
Intent能夠理解爲當前app 「想要作什麼」。你能夠爲多任務使用Intent,可是大多數狀況下
咱們經常是用Intent來啓動另一個Activity。
如今咱們在sendMessage()方法內建立一個Intent來啓動另一個叫DisplayMessageActivity的Activity。
Intent intent = new Intent(this, DisplayMessageActivity.class);
Intent函數初始化構造函數須要兩個參數:
1.第一個參數是一個設備上下文Context(這裏使用this的緣由是由於Activity類是Context類的子類)
2.第二個參數是Intent須要啓動的Activity。
注意:當咱們在Eclipse以及其相似的IDE下編寫此代碼時,使用DisplayMessageActivity時會觸發一個錯誤。
如今先忽略這個錯誤提示,由於咱們尚未建立Activity DisplayMessageActivity,咱們會在稍後建立它。
建立的Intent不只僅可以啓動一個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.content.Intent包和android:widget.EditText包,並且咱們稍後會定義
EXTRA_MESSAGE常量。
Intent能夠附加各類數據類型的集合使用STL中咱們熟知的鍵-值的方式,咱們稱它爲額外的(extras)。
附加方法就是使用putExtra()方法,它的第一個參數就是鍵值,第二個參數就是該鍵對應的值。
爲了指定的Activity可以獲取Intent附加的值,咱們須要使用一個public類型的常量來做爲附加值的鍵值。
因此咱們定義在MainActivity類的頂部建立EXTRA_MESSAGE常量:
public class MainActivity extends Activity { public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"; ... }
爲了區分不一樣的app,一種好的定義鍵值的方式就是使用app包的名字做爲前綴。這樣可以確保它的惟一性。
啓動指定的Activity
爲了啓動Activity,咱們須要調用startActivity(方法),該方法的參數就是咱們建立好的Intent。
當系統執行到該方法時,就會建立一個由Intent指定的Activity的實例(句柄?)
完成以上步驟之後,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); }
接下來咱們就須要建立DisplayMessageActivity類了。
建立第二個Activity類。
使用Eclipse建立另一個Activity類的步驟以下:
1.點擊新建圖標。
2.選擇Android文件夾下的Android Activity,而後單擊下一步。
3.選擇BlankActivity,而後單擊下一步。
4.填寫新類的具體參數:
11. Project: MyFirstApp ->也就是咱們當前的app
22. Activity Name: DisplayMessageActivity ->也就是咱們將要建立的類的名稱
33. Layout Name: activity_display_message -> 佈局xml文件名稱
44. Title: My Message -> 新Activity標題名稱
55. Navigation Type: none
5.點擊完成按鈕。
若是你使用的不是Eclipse或者是命令行工具,在項目src目錄下於MainActivity.java文件相鄰位置建立一個DisplayMessageActivity.java文件。
若是使用的是Eclipse建立的Activity,那麼咱們打開DisplayMessagActivity.java文件。
1.新建的類已經幫咱們建立好了onCreate()方法。
2.還有一個建立好的哦你CreateOption是Menu()方法,不過這個例子不須要它,因此能夠刪除掉。
3.還有一個建立好的哦你Option是ItemSelected()方法,這個方法用來處理單擊ActionBar上的上一步操做按鈕的點擊事件。保留該方法。
由於ActionBar的API只在HONEYCOMB(API level 11)以及其之後的版本才能使用。因此咱們必須在使用getActionBar()方法前進行條件判斷
以判斷當前的平臺是否支持此API。另外咱們必須在onCreate()方法內使用@SuppressLint("NewApi")標籤來避免lint錯誤。(注:新版本的Android SDK
已經不須要這令不處理了,它本身建立好了一個setupActionBar()方法來進行檢查操做。)
如今DisplayMessageActivity類的內容大體以下:
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); } }
若是你是用的不是Eclipse的集成開發環境,使用上面的代碼更新你的DisplayMessageActivity類。
全部Activity的子類都必須重載onCreate()方法。當建立該類的實例的時候,系統會調用該函數。
在這個函數內部你必須使用setContentView()方法來定義Activity的佈局。
注意:若是你使用的不是Eclipse,你的setContentView()所須要的activity_display_message佈局文件
並無自動建立,不用擔憂,稍後在咱們使用到該佈局的時候就會添加它。
添加標題字符串
<resources>
...
<string name="title_activity_display_message">My Message</string>
</resources>
添加新類到mainfest文件
全部的Activities都須要在mainfest文件中進行聲明,可使用<activity>元素(標籤)進行聲明。
同理Eclipse會自動爲咱們建立該元素,因此若是你使用的不是Eclipse,那麼就須要在mainfest文件中添加
以下內容:
<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屬性標識了該類的父類的類名稱。系統使用此值去實現默認的操做。
好比安卓4.1以及其之後版本的後退操做。咱們也可使用這種行爲在老版本中經過SupportLibrary
以及添加<meta-data>元素。
若是使用的是Eclipse那麼咱們就能夠運行這個APP了,可是不會實現什麼大功能,當咱們點擊這個按鈕的
時候,只是顯示"Hello world",而這個字符串就是咱們第一課所看到由模板自動生成的。
接收Intent
每個被Intent調用的Activity,不管用戶是如何操做抵達這一步的,咱們均可以經過調用getIntent()方法
來獲得Intent以及其中附加的數據包。
下面來看一下在DisplayMessageAcitvity類的onCrate()方法中來獲得intent而且獲取MainActivity中附加的數據包。
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
顯示附加的數據包
爲了顯示數據到屏幕上,咱們將建立一個TextView窗口而且使用setText()方法將獲取到的數據包賦予此Textview。
而後使用setContentView()方法將此TextView設置到DisplayMessageAcitvity的顯示視窗中。
DisplayMessageAcitvity完整的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); }
如今咱們能夠運行整個App了,咱們輸入一些字符串在MainActivity的EditText中,而後單擊send button,
那麼咱們輸入的字符串就會在intent調用的DisplayMessageAcitvity中顯示出來了。
若是你使用的Eclipse,你能夠跳過下一段落,由於Eclipse的模板已經提供了新建類的標題字符串
若是你使用的不是Eclipse,添加標題字符串在strings.xml文件中: