啟動(dòng)另一個(gè)Android的Activity

2018-08-02 18:32 更新

編寫(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。

響應(yīng)Send(發(fā)送)按鈕

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è)方法必須滿足以下條件:

  • 是public函數(shù)
  • 無(wú)返回值
  • 參數(shù)唯一(為View類(lèi)型,代表被點(diǎn)擊的視圖)

接下來(lái),你可以在這個(gè)方法中編寫(xiě)讀取文本內(nèi)容,并將該內(nèi)容傳到另一個(gè)Activity的代碼。

構(gòu)建一個(gè)Intent

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)前ActivityContext的子類(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)。

創(chuàng)建第二個(gè)Activity

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

使用Android Studio創(chuàng)建的activity會(huì)實(shí)現(xiàn)一個(gè)默認(rèn)的onCreate()方法.

  1. 在Android Studio的java 目錄, 選擇包名 com.mycompany.myfirstapp,右鍵選擇 New > Activity > Blank Activity.

  2. Choose options窗口,配置activity:

    • Activity Name: DisplayMessageActivity
  • Layout Name: activity_display_message
  • Title: My Message
  • Hierarchical Parent: com.mycompany.myfirstapp.MyActivity

    Package name: com.mycompany.myfirstapp 點(diǎn)擊 Finish.

    adt-new-activity

    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

    如果使用命令行工具創(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。

    接收Intent

    不管用戶導(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.contentRelativeLayout

    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)信息了。如圖:

    firstapp

    到此為止,已經(jīng)創(chuàng)建好我們的第一個(gè)Android應(yīng)用了!


  • 以上內(nèi)容是否對(duì)您有幫助:
    在線筆記
    App下載
    App下載

    掃描二維碼

    下載編程獅App

    公眾號(hào)
    微信公眾號(hào)

    編程獅公眾號(hào)