Android學習路線(五)開啟另一個Activity,androidactivity
在完成了 上一篇課程後,你已經有了一個應用。這個應用展示了一個包含一個文字框和一個按鈕的activity(一個單獨的介面)。在這次的課程中,你將會通過在MainActivity中添加一些代碼,來讓當給你點擊Send按鈕時能夠跳轉到另一個activity中。
響應Send按鈕
為了響應按鈕的點擊事件,開啟fragment_main.xml 布局檔案,然後在 <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",是你的activity中的一個方法的名稱,當使用者點擊按鈕時,就會調用這個方法。
開啟MainActivity 類,加入相應的方法:
/** Called when the user clicks the Send button */public void sendMessage(View view) { // Do something in response to button}
為了能夠讓系統匹配到給android:onClick賦的值的方法名稱所對應的方法,簽名必須嚴格的按照顯示的來。(the signature must be exactly as shown. )具體如下,這個方法必須要:
- 是Public的
- 傳回型別為void
- 只有一個
View 類型的參數(它就代表被點擊的View)
接下來,你就要填滿這個方法。來讀取文字框中的內容,然後將內容傳遞到另一個activity內。
構架一個Intent
Intent 是一個提供兩個分離的組件(例如兩個activities)在運行時綁定的對象。Intent 表示一個應用“意圖要做些事情”。你可以使用intent做很多很多事情,但是它最常用的還是開啟另一個activity。
在sendMessage() 方法內部,建立一個Intent 來開啟一個名為DisplayMessageActivity的activity:
Intent intent = new Intent(this, DisplayMessageActivity.class);
這需要先匯入 Intent 類:
import android.content.Intent;
貼士: 在Eclipse中,可以用Ctrl + Shift + O來匯入未匯入的類(在Mac中使用Cmd + Shift + O)。
這裡使用的構造器包含兩個參數:
- 第一個參數是
Context (這裡使用this 是因為Activity 類是 Context的子類)
- 第二個參數是系統要傳遞給
Intent 的應用組件的類(在本例中是要被開啟的activity)
向其他的應用發送intent
在本應用中建立的intent是明確的intent,因為izhgeIntent 指定了intent應該給出的明確的應用組件。然後Intent同樣也可以是隱晦的,在一些情況下,intent並沒有指定組件,但是它允許在裝置安裝的應用中滿足作為參數傳入Intent的規範的應用來響應這個intent。更多資訊,請查看課程: Interacting with Other Apps.
提示: DisplayMessageActivity 的將會導致一個error,因為你在使用向Eclipse這種IDE,它會發現這個類還不存在。現在先忽略這個錯誤,你馬上就會建立這個類。
Intent不僅僅只能夠開啟另一個activity,它還能夠攜帶一個包含資料的bundle。在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 可以攜帶一系列被稱作extars的不同類型的鍵值對的集合。putExtra() 方式的第一個參數是鍵的名稱,第二個參數是值。
為了讓下一個activity能夠查到extra data,你應該使用公用的常量為你的intent的鍵賦值。因此,在MainActivity的頭部添加定義EXTRA_MESSAGE:
public class MainActivity extends ActionBarActivity { public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"; ...}
在你的應用有何其他應用互動的情況下,使用你的應用的包名作為intent extras定義的鍵的定義是一個很好的選擇。
開啟第二個Activity
要開啟一個activity,調用startActivity() 方法,並且將Intent傳進去,系統接受調用後會開啟intent所指定的Activity 的一個執行個體。
在新的代碼中,被Send按鈕調用的完整的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
圖1. Eclipse中的建立Activity嚮導
使用Eclipse建立 activity :
- 在工具列點擊 New 。
- 在出現的視窗中,開啟Android 檔案夾並選擇Android Activity,然後點擊Next。
- 選擇BlankActivity 點擊 Next。
- 填滿Activity的詳情:
- Project: MyFirstApp
- Activity Name: DisplayMessageActivity
- Layout Name: activity_display_message
- Fragment Layout Name: fragment_display_message
- Title: My Message
- Hierarchial Parent: com.example.myfirstapp.MainActivity
- Navigation Type: None
點擊 Finish。
如果你使用的不是Eclipse,或者是在使用命令列工具,那麼在src/ 目錄下建立DisplayMessageActivity類,然後再MainActivity.java 中匯入。
開啟DisplayMessageActivity.java 檔案,如果你使用Eclipse:
- 這個類中已經包含了一個
onCreate() 方法的實現,稍後你會更新這個實現。
- 同樣還有一個
onCreateOptionsMenu() 方法的實現,但是你在本例中不會使用到,你可以將它刪掉。
- 還有
onOptionsItemSelected() 方法,它使用者處理action bar 的Up 事件,保持它的原樣。
- 還有一個繼承Fragment類的
PlaceholderFragment 類。在這個Activity中你不會使用到。
Fragments 將方法和UI分解為可重用的模組。