android-啟動另外一個Activity


啟動另外一個Activity

 

在完成了上一節課的學習后,我們已經創建了一個帶有text輸入框和一個button的app。

在本課中,我們將在MainActivity類中添加SendButton的單擊響應代碼以啟動另外一個Activity。

 

響應Send Button

 

為了響應Send Button的單擊事件,我們打開Activity_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",是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類。

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文件中:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM