Android Develop Training中文翻譯06《Starting Another Activity》

Starting Another Activity

After completing the previous lesson, you have an app that shows an activity (a single screen) with a text field and a button. In this lesson, you’ll add some code to MainActivity that starts a new activity when the user clicks the Send button.

接下來,主要new一個activity出來,然後點擊send button ,就start這個activity。

 

Respond to the Send Button

To respond to the button's on-click event, open the main.xml layout file and add theandroid:onClick attribute to the <Button> element:

     <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/button_send"
            android:onClick="sendMessage" />

The android:onClick attribute’s value, "sendMessage", is the name of a method in your activity that the system calls when the user clicks the button.

android:onClick的值"sendMessage", 是activity裏的一個方法的名字,當按鈕click的時候,系統會調用"sendMessage"方法。

Open the MainActivity class and add the corresponding method:

android筆記(3):Starting <wbr>Another <wbr>Activity
Tip: In Eclipse, press Ctrl + Shift + O to import missing classes

      import 類的快捷鍵哦

In order for the system to match this method to the method name given to android:onClick, the signature must be exactly as shown. Specifically, the method must: 方法必須滿足:
1) Be public 
2) Have a void return value
3) Have a View as the only parameter (this will be the View that was clicked)

    這裏的View對象就指代這個Button了,UI裏所有的對象都是View和View Group的實例。

 

下一步,用方法讀取activity裏的text field的值,然後把text顯示在另一個activity裏。

 

Build an Intent

An Intent is an object that provides runtime binding between separate components (such as two activities). The Intent represents an app’s "intent to do something." You can use intents for a wide variety of tasks, but most often they’re used to start another activity.

Intent是一個提供運行時綁定的對象,它可以綁定兩個獨立的組件,比如兩個activity。Intent表示了這個應用的意圖,可以完成很多task,但用的最多的還是start另外一個activity。

 

Inside the sendMessage() method, create an Intent to start an activity called DisplayMessageActivity:

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

 

The constructor(構造器) used here takes two parameters:
1. A Context as its first parameter (this is used because the Activity class is a subclass of Context)
2. The Class of the app component to which the system should deliver the Intent (in this case, the activity that should be started)    Intent被傳到另外一個應用組件,也就是需要轉到的activity。

 

An intent not only allows you to start another activity, but it can carry a bundle of data to the activity as well. So, use findViewById() to get the EditText element and add its text value to the intent:

intent還可以用來傳data給activity,所以,用findViewById()函數找到文本輸入UI組件,並把其文本內容綁定到這個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);

An Intent can carry a collection of various data types as key-value pairs called extras. The putExtra() method takes the key name in the first parameter and the value in the second parameter.

intent裏面綁定的是鍵值對,putExtra() 函數第一個參數是key,第二個參數是value

In order for the next activity to query the extra data, you should define your key using a public constant. So add the EXTRA_MESSAGE definition to the top of the MainActivity class:

 爲了轉到的activity能夠查詢data,所以用一個常量定義key,所以要加一個常量EXTRA_MESSAGE的定義在MainActivity文件的頭部。

 public class MainActivity extends Activity {
   
 public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    ...

It's generally a good practice to define keys for intent extras using your app's package name as a prefix. This ensures they are unique, in case your app interacts with other apps. 用包名當前綴來定義key是個最佳實踐。

 

Sending an intent to other apps

The intent created in this lesson is what's considered an explicit intent, because the Intent specifies the exact app component to which the intent should be given. However, intents can also be implicit, in which case the Intent does not specify the desired component, but allows any app installed on the device to respond to the intent as long as it satisfies the meta-data specifications for the action that's specified in various Intent parameters.

 

Start the Second Activity

To start an activity, you simply need to call startActivity() and pass it your Intent. The system receives this call and starts an instance of the Activity specified by the Intent.

要啓動一個activity,只需要調用startActivity() 方法並傳給它intent,系統接收到調用指令,就會啓動一個根據intent指定的activity。

With this new code, the complete sendMessage() method that's invoked by the Send button now looks like this:


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

 

Now you need to create the DisplayMessageActivity class in order for this to work.

 

Create the Second Activity

To create a new activity using Eclipse:
1. Click New android筆記(3):Starting <wbr>Another <wbr>Activity

                           in the toolbar.
2. In the window that appears, open the Android folder and select Android           Activity. Click Next.
3. Select BlankActivity and click Next.
4. Fill in the activity details:
    Project: MyFirstApp
    Activity Name: DisplayMessageActivity
    Layout Name: activity_display_message
    Navigation Type: None
    Hierarchial Parent: com.example.myfirstapp.MainActivity
    Title: My Message

Click Finish.

 android筆記(3):Starting <wbr>Another <wbr>Activity

android筆記(3):Starting <wbr>Another <wbr>Activity

android筆記(3):Starting <wbr>Another <wbr>Activity

android筆記(3):Starting <wbr>Another <wbr>Activity

If you're using a different IDE or the command line tools, create a new file named DisplayMessageActivity.java in the project's src/ directory, next to the original MainActivity.java file. 手工建立一個DisplayMessageActivity.java文件也是可以的,但是路徑是要有要求的。

 

Open the DisplayMessageActivity.java file. If you used Eclipse to create it, the class already includes an implementation of the required onCreate() method. There's also an implementation of the onCreateOptionsMenu() method, but you won't need it for this app so you can remove it. The class should look like this:

public class DisplayMessageActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);
    }
}


All subclasses of Activity must implement the onCreate() method. The system calls this when creating a new instance of the activity. It is where you must define the activity layout and where you should perform initial setup for the activity components.

所有的Activity的子類都必須實現onCreate()方法,系統調用這個onCreate()方法來創建一個新的activity實例,在這裏,你必須定義activity的佈局layout並且實現activity的組件的初始化。

 

Add it to the manifest

You must declare all activities in your manifest file, AndroidManifest.xml, using an<activity> element. 

必須在manifest文件裏聲明所有的activity,通過在AndroidManifest.xml添加<activity>元素來完成聲明。

When you use the Eclipse tools to create the activity, it creates a default entry. It should look like this:     eclipse創建activity的默認設置:

<application ... >
    ...
    <activity
        android:name=".DisplayMessageActivity"
        android:label="@string/title_activity_display_message" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

 

The <meta-data> element declares the name of this activity's parent activity within the app's logical hierarchy. The Android Support Library uses this information to implement default navigation behaviors, such as Up navigation. 

 

The app is now runnable because the Intent in the first activity now resolves to the DisplayMessageActivity class. If you run the app now, clicking the Send button starts the second activity, but it's still using the default "Hello world" layout.

 

Receive the Intent

Every Activity is invoked by an Intent, regardless of how the user navigated there. You can get the Intent that started your activity by calling getIntent() and retrieve the data contained within it.  

  捕獲intent並檢索數據

In the DisplayMessageActivity class’s onCreate() method, get the intent and extract the message delivered by MainActivity: 

在DisplayMessageActivity類文件裏的onCreate()方法中,捕獲intent並從中提取數據

    Intent intent = getIntent();
    String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

 

Display the Message

To show the message on the screen, create a TextView widget and set the text usingsetText(). Then add the TextView as the root view of the activity’s layout by passing it to setContentView().

 @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);  傳入string類型message設置內容

    // Set the text view as the activity layout
    setContentView(textView);  
}

 You can now run the app. When it opens, type a message in the text field, click Send, and the message appears on the second activity.

 

 

 

 

 

 

 


 

 

 

 

 

 

發佈了27 篇原創文章 · 獲贊 16 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章