4) 十分鐘學會android--建立第一個APP,啟動另一個Activity

來源:互聯網
上載者:User

標籤:右鍵   activity   ttext   nes   creat   應該   lis   class   lte   

在完成上一課(建立簡單的使用者介面)後,我們已經擁有了顯示一個activity(一個介面)的app(應用),該activity包含了一個文字欄位和一個按鈕。在這節課中,我們將添加一些新的代碼到MyActivity中,當使用者點擊發送(Send)按鈕時啟動一個新的activity。

響應Send(發送)按鈕

1 在Android Studio中開啟res/layout目錄下的content_my.xml 檔案.

2 為 Button 標籤添加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"即為使用者點擊螢幕按鈕時觸發方法的名字。

3 開啟java/com.mycompany.myfirstapp目錄下MyActivity.java 檔案.

4 在MyActivity.java 中添加sendMessage() 函數:

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}

為使系統能夠將該方法(你剛在MyActivity.java中添加的sendMessage方法)與在android:onClick屬性中提供的方法名字匹配,它們的名字必須一致,特別需要注意的是,這個方法必須滿足以下條件:

  • 是public函數
  • 無傳回值
  • 參數唯一(為View類型,代表被點擊的視圖)

接下來,你可以在這個方法中編寫讀取常值內容,並將該內容傳到另一個Activity的代碼。

構建一個Intent

Intent是在不同組件中(比如兩個Activity)提供運行時綁定的對象。Intent代表一個應用"想去做什麼事",你可以用它做各種各樣的任務,不過大部分的時候他們被用來啟動另一個Activity。更詳細的內容可以參考Intents and Intent Filters。

1 在MyActivity.java的sendMessage()方法中建立一個Intent並啟動名為DisplayMessageActivity的Activity:

java/com.mycompany.myfirstapp/MyActivity.java

Intent intent = new Intent(this, DisplayMessageActivity.class);

Note:如果使用的是類似Android Studio的IDE,這裡對DisplayMessageActivity的引用會報錯,因為這個類還不存在;暫時先忽略這個錯誤,我們很快就要去建立這個類了。

在這個Intent建構函式中有兩個參數:

  • 第一個參數是Context(之所以用this是因為當前Activity是Context的子類)

  • 接受系統發送Intent的應用組件的Class(在這個案例中,指將要被啟動的activity)。

Android Studio會提示匯入Intent類。

2 在檔案開始處匯入Intent類:

java/com.mycompany.myfirstapp/MyActivity.java

import android.content.Intent;

Tip:在Android Studio中,按Alt + Enter 可以匯入缺失的類(在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 在檔案開始處匯入EditText類.

在Android Studio中,按Alt + Enter 可以匯入缺失的類(在Mac中使用option + return)

5 把EditText的常值內容關聯到一個本地 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 的鍵-值對資料類型。 putExtra()方法把鍵名作為第一個參數,把值作為第二個參數。

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";    ...}

為讓新啟動的activity能查詢extra資料。定義key為一個public型的常量,通常使用應用程式套件組合名作為首碼來定義鍵是很好的做法,這樣在應用程式與其他應用程式進行互動時仍可以確保鍵是唯一的。

7 在sendMessage()函數裡,調用startActivity()完成新activity的啟動,現在完整的代碼應該是下面這個樣子:

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);}

運行這個方法,系統收到我們的請求後會執行個體化在Intent中指定的Activity,現在需要建立一個DisplayMessageActivity類使程式能夠執行起來。

建立第二個Activity

Activity所有子類都必須實現onCreate()方法。建立activity的執行個體時系統會調用該方式,此時必須用 setContentView()來定義Activity布局,以對Activity進行初始化。

使用Android Studio建立新的Activity

使用Android Studio建立的activity會實現一個預設的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 點擊 Finish.

    3 開啟DisplayMessageActivity.java檔案,此類已經實現了onCreate()方法,稍後需要更新此方法。

    如果使用 Android Studio開發,現在已經可以點擊Send按鈕啟動這個activity了,但顯示的仍然是模板提供的預設內容"Hello world",稍後修改顯示自訂的常值內容。

    使用命令列建立activity

    如果使用命令列工具建立activity,按如下步驟操作:

    1 在工程的src/目錄下,緊挨著MyActivity.java建立一個新檔案DisplayMessageActivity.java.

    2 寫入如下代碼:

    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,工程中可能不會包含由setContentView()請求的activity_display_message layout,但這沒關係,因為等下會修改這個方法。

    3 把新Activity的標題添加到strings.xml檔案:

    <resources>    ...    <string name="title_activity_display_message">My Message</string></resources>

    4 在 AndroidManifest.xml的Application 標籤內為 DisplayMessageActivity添加 標籤,如下:

    <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屬性聲明了在應用程式中該Activity邏輯層面的父類Activity的名稱。 系統使用此值來實現預設導航操作,比如在Android 4.1(API level 16)或者更高版本中的Up navigation。 使用Support Library,如上所示的<meta-data>元素可以為安卓舊版本提供相同功能。

    Note:我們的Android SDK應該已經包含了最新的Android Support Library,它包含在ADT外掛程式中。但如果用的是別的IDE,則需要在 Adding Platforms and Packages 中安裝。當Android Studio中使用模板時,Support Library會自動加入我們的工程中(在Android Dependencies中你以看到相應的JAR檔案)。如果不使用Android Studio,就需要手動將Support Library添加到我們的工程中,參考setting up the Support Library。

    接收Intent

    不管使用者導航到哪,每個Activity都是通過Intent被調用的。我們可以通過調用getIntent()來擷取啟動activity的Intent及其包含的資料。

    1 編輯java/com.mycompany.myfirstapp目錄下的DisplayMessageActivity.java檔案.

    2 得到intent 並賦值給本地變數.

    Intent intent = getIntent();

    3 為Intent匯入包.

    在Android Studio中,按Alt + Enter 可以匯入缺失的類(在Mac中使用option + return).

    4 調用 getStringExtra()提取從 MyActivity 傳遞過來的訊息.

    String message = intent.getStringExtra(MyActivity.EXTRA_MESSAGE);
    顯示文本

    1 在res/layout目錄下,編輯檔案content_display_message.xml.

    2 為標籤添加id屬性,你之後需要用這個id屬性來調用這個對象.

    < RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"...android:id="@+id/content"></RelativeLayout>

    3 重新來編輯DisplayMessageActivity.java

    4 在onCreate()方法中建立一個對象TextView

    TextView textView = new TextView(this);

    5 用setText()來設定文本字型大小和內容.

    textView.setTextSize(40);textView.setText(message);

    6 將TextView加入之前被標記為R.id.contentRelativeLayout

    RelativeLayout layout = (RelativeLayout) findViewById(R.id.content);layout.addView(textView);

    7 為TextView 匯入包.

    在Android Studio中,按Alt + Enter 可以匯入缺失的類(在Mac中使用option + return).

    DisplayMessageActivity的完整onCreate()方法應該如下:

    @Overrideprotected 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);}

    現在你可以運行app,在文本中輸入資訊,點擊Send(發送)按鈕,ok,現在就可以在第二Activity上看到發送過來資訊了。

    到此為止,已經建立好我們的第一個Android應用了!

4) 十分鐘學會android--建立第一個APP,啟動另一個Activity

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.