標籤:右鍵 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建構函式中有兩個參數:
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()方法.
在Android Studio的java 目錄, 選擇包名 com.mycompany.myfirstapp,右鍵選擇 New > Activity > Blank Activity.
在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.content
的RelativeLayout
中
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