咖啡馆

有空坐下来喝杯咖啡,放松下心情~
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1-4 Starting Another Activity

Posted on 2012-09-01 18:47  mshwu  阅读(313)  评论(0编辑  收藏  举报

本例源码:/Files/mshwu/L3_simpleinterface2.rar

上一节,一个最简单的Activity,包括一个text field,跟一个按钮,这一节将响应该button的事件,开启另一个Activity。

 

Response to the Button

对Button事件的响应,也可以通过配置来完成,

在layout定义文件activity_main.xml中添加android:onclick 于<button>组件中:

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

 

或可视化编辑环境中如下图所示:

image

 

属性的值 SendMessage就是事件监听器的响应方法,当button被点击时,activity 中的SendMessage方法将会被调用,

方法结构:

/** Called when the user selects the Send button */

public void sendMessage(View view) {

// Do something in response to button

}

Tip:In Eclipse, press Ctrl + Shift + O to import missing classes

 

通常事件监听器的响应方法必须满足:

  • 必须是public 的
  • 返回 void 值
  • 唯一的参数view(被点击的view)

下面,我们将通过这个方法,读取text field 的值,传给另一个activity.

 

Build and Intent

intent 是一种对两种不同的组件提供运行时绑定的Object(比如两个activity),Intent理解为应该程序 “intent to do something”,Intent 可被广泛应用于不同的任务,用的最多就是用于开启另一个activity,

在我们的响应方法里,创建一个intent,用于开启另一个Activity叫DisplayMessageActivity,

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

 

构造方法有两个参数:

第一个是Context,因为Activity 是这个类的一个子类。

第二个是Class,Intent 将把信息发送到这一组件,在这个例子,新的Activity将会被开启。

 

Intent 不但可以帮你开启另一个Activity,还可以传递捆绑的多种数据类型给新的Activity, 通过findViewById(API:Finds a view that was identified by the id attribute from the XML that was processed in onCreate(Bundle).)方法查找到EditText对象,并且把它的内容添加到intent中:

Intent intent=new Intent(this,DisplayMessageActivity);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);

Intent 捆绑的多种数据类型是用一种key-value对的形式,叫Extra, 方法putExtra(key, value)把数据按key – value捆绑到Intent 中,

EXTRA_MESSAGE是我们定义的一个常量,当做key来使用,用你的包名前缀来做为定义Extras的key会是一个比较不错的习惯,因为你的程序要与别的程序打交道,可以确保你的KEY的唯一性。

 

Start the second Activity

我们需要调用startActivity()方法,传递intent进去开启一个新的Activity, 当系统接收到这些信息时,就会开启一个Intent所描述的Activity的新的实例,现在,完整的响应方法如下:

/** Called when the user selects 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);
}
 

现在为了让程序能跑起来,我们必须创建另一个新的Activity类DisplayMessageActivity。

 

Create the second Activity

src/<package-name>/directory 新建类DisplayMessageActivity.java,

在类里,添加方法 onCreate:

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

 

所有的Activity子类必须回调父类的onCreate方法,当你创建一个新的Activity实例时,系统会调用这一个方法,这里可以实现Activity layout,初始化必要的activity组件。

 

Add it to the manifest

所有的Activity必须在AndroidManifest.xml中有定义,这一文件可以理解成WEB中的WEB.XML

 

Receive the Intent

所有的Activity都是由intent触发,我们可以通过activity的方法getIntent()得到触发你的activity的Intent,从而也可以得到它所捆绑的数据,

DisplayMessageActivity 类的onCreate方法里, 得到intent实例从面提取第一个Activity发送的信息:

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

 

Display the Message

创建一个textview,用于显示信息,勇过setContentView()方法把TextView设为Activity布局的根View

完整的onCreate方法在第二个activity中:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Get the message from the intent
    Intent intent = getIntent();
    String message = intent.getStringExtra(EXTRA_MESSAGE);

    // Create the text view
    TextView textView = new TextView(this);
    textView.setTextSize(40);
    textView.setText(message);

    setContentView(textView);
}
 

运行效果:

image

Click Send button

image

 

到此,你的第一个应用程序创建完成

 

下一节 Managing the Activity Lifecycle