Android Develop Training中文翻译06《Starting Another Activity》 java程序员

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.

 

 

 

 

 

 

 


 

 

 

 

 

 

原文地址:https://www.cnblogs.com/java20130725/p/3215472.html