启动另一个Activity
在你完成前面的课程后,你已经有一个App显示一个Activity(一个屏幕),屏幕上有一个文本域和一个按钮。在这个课程,你将在MainActivity中增加一些代码,当用户点击这个发送按钮时启动另一个Activty。
响应发送按钮
为了响应按钮的鼠标单击事件,打开activity_main.xml布局文件,在<Button>元素上增加android:onClick属性。
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_send" android:onClick="sendMessage" />
android:onClick属性的值“sendMessage”是用户单击鼠标时系统调用的在你的activity中的方法名。
打开MainActivity类(在工程的src/目录下)然后增加对应的方法。
/** Called when the user clicks the Send button */ public void sendMessage(View view) { // Do something in response to button }
这要求你导入View类。
import android.view.View;
提示:在Eclipse中,按Ctrl+Shift+O自动导入缺少的类(mac上是Cmd+Shift+O)。
为了让系统能够将这个方法匹配到android:onClick给定的方法名,方法签名必须和所展示的完全一样。明确的,这个方法必须:
- 是public的
- 返回值是void类型
- 只有一个View作为它的唯一参数(这个View就是被点击的View)
接下来你将会补充这个方法来读取文本域的内容并将那个文本传递到另一个Activity。
构建一个Intent
Intent是一个在两个不同的组件(比如两个Activity)之间提供运行时绑定的对象。Intent表示一个app的“想要做什么事”。你能使用Intent完成各种各样的任务,但它们最常被用于启动另一个Activity。
在sendMessage方法内,创建一个Intent来启动一个名为DisplayMessageActivity的Activity。
Intent intent = new Intent(this, DisplayMessageActivity.class);这里使用的构造器使用两个参数:
- 一个Context作为它的第一个参数(使用this是因为Activity类是Context类的一个子类)
- app组件的类(Class),系统应该分发这个Intent到这个类(在这个例子中,是那个应该启动的Activity)。
一个Intent不仅允许你启动另一个Activity,它同样也能携带一些数据给那个activity。在sendMessage方法内部,使用findViewById()来获取EditText元素,并将它的文本值添加到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);注意:你需要导入语句为android.content.Intent和android.widget.EditText。你很快就将定义 EXTRA_MESSAGE常量。
一个Intent可以携带一堆各种各样的数据,类型为键值对,称为extra。pubExtra()使用键的名字作为第一个参数,值作为第二个参数。
为了让另一个Activity可以查询数据,你应该使用一个public常量为你的Intent的extra定义键,因此将EXTRA_MESSAGE的定义添加在MainActivity类的顶部。
public class MainActivity extends Activity { public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE"; ... }使用app的包名作为intent的extra的键的前缀通常是一个好的实践。这个可以保证它们是唯一的。否则你的app会同其他app交互。
启动第二个Activity
为了启动一个Activity,调用startActivity()然后将你的Intent传递给它。系统接收到这个调用,然后启动一个Intent中指定的Activity的实例。
使用这些代码,发送按钮所调用的完整的sendMessage()方法现在看着如下所示:
/** 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); }现在你需要去创建DisplayMessageActivity类从而使这个可以工作。
创建第二个Activity
使用Eclipse创建一个新的Activity:
- 点击工具栏中的新建。
- 在弹出的窗口中选择Android文件夹然后选择Android Actitivy,点击下一步。
- 选择BlankActivity,点击下一步。
- 填满Activity的细节,如下所示
最后点击完成。
打开DisplayMessageActivity.java文件,如果你使用Eclipse创建这个Activity:
- 这个类已经包含一个需要的onCreate()方法的实现
- 同样有一个onCreateOptionsMenu()方法的实现,但是你在这个app里面将不会需要它,因此你将它删除。
- 同样有一个onOptionsItemSelected()方法的实现,它处理工具栏向上的操作,保持原样。
public class DisplayMessageActivity extends Activity { @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_display_message); // Make sure we're running on Honeycomb or higher to use ActionBar APIs if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // Show the Up button in the action bar. getActionBar().setDisplayHomeAsUpEnabled(true); } } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); } }如果你是使用Eclipse以外的IDE,请使用上面的代码更新你的DisplayMessageActivity类。 所有Activity的子类都必须实现onCreate()方法。当创建一个Activity的新实例时系统就会调用这个方法。这个方法是你必须使用setContentView()方法定义Activity布局的地方,也是你应该为Activity组件执行初始设置的地方。 注意:如果你使用Eclipse以外的IDE,你的工程不会包含activity_display_message布局,而这个布局是setContentView()所需要的。但这个没问题,因为后面会更新这个方法,并且不会用到这个布局。 增加标题字符串