本实例有3个界面(Activity)。activity_main界面有两个按钮,Button1和Button2。Button1单击后会跳转到activityb,Button2单击后会跳转到activityc。activityc有一个输入框和一个“确定”按钮,单击“确定”按钮将关闭activityc,并将输入框中的内容回传到activity_main中。activity_main获取到activityc的回传数据后,将其内容显示在Button2的下方。各界面的布局效果如下:
编程实现
1、新建一个android项目(过程省略),新建的项目中默认会自动创建activity_main界面及对应的MainActivity.java,我们只需要再添加activityb和activityc界面即可。在layout目录下添加activityb.xml和activityc.xml文件,在src目录下添加ActivityB.java和ActivityC.java文件。添加后,此项目工程目录如下:
2、编辑activity_main.xml,添加两个按钮和一个TextView,完成后内容大致如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/buttona1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/buttona1_text" /> <Button android:id="@+id/buttona2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/buttona2_text" /> <TextView android:id="@+id/tvDisplay" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
3、编辑activityb.xml,添加一个TextView,完成后内容大致如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/tvActivityb" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/activityb_tv_text" /> </LinearLayout>
4、编辑activityc.xml,添加一个EditText和一个按钮,完成后内容大致如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/etActivityc" android:layout_width="fill_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="text" > <requestFocus /> </EditText> <Button android:id="@+id/buttonc1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/buttonc1_text" /> </LinearLayout>
5、编辑MainActivity.java。MainActivity.java中定义了类MainActivity。MainActivity继承自Activity,以activity_main.xml定义的界面为显示界面。请注意代码中启动其它Activity的方式。如果想从启动的其它Activity中获取返回信息,使用startActivityForResult,否者使用startActivity。使用startActivityForResult启动的Activity调用setResult时onActivityResult方法会被调用,所以为了获取返回信息就需要重新实现onActivityResult方法。
startActivityForResult有两个参数,第一个是Intent对象,第二个为请求码,用于区分不同的请求。例如,通过startActivityForResult启动了多个Activity,当这些Activity调用setResult时onActivityResult都会被调用,那在onActivityResult中如何区分返回信息来自哪个Activity呢?这时就可以通过请求码来区分。Activity关闭时,相关请求码会传入onActivityResult方法中,所以在处理时可以根据请求码区分不同Activity的返回信息。MainActivity.java内容如下:
package com.helloworld.helloworldproject; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.content.Intent; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //取得activity main中的两个button Button buttona1 = (Button)findViewById(R.id.buttona1); Button buttona2 = (Button)findViewById(R.id.buttona2); //为buttona1绑定单击事件 buttona1.setOnClickListener(new buttona1_Listener()); buttona2.setOnClickListener(new buttona2_Listener()); } //buttona1单击事件处理类 private class buttona1_Listener implements View.OnClickListener { public void onClick(View v) { //TODO Auto-generated method stub //使用intent启动ActivityB Intent _intent = new Intent(MainActivity.this, ActivityB.class); startActivity(_intent); } } //buttona2单击事件处理类 private class buttona2_Listener implements View.OnClickListener { public void onClick(View v) { //TODO Auto-generated method stub //使用intent启动ActivityC Intent _intent = new Intent(MainActivity.this, ActivityC.class); startActivityForResult(_intent, 100); } } //通过setContentView启动的Activity返回时,此方法被调用 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == 100 && resultCode == Activity.RESULT_OK) { String val = data.getExtras().getString("helloworld"); TextView textView = (TextView)findViewById(R.id.tvDisplay); textView.setText("来自ActivityC的值: "+val); } } }
6、编辑ActivityB.java。ActivityB.java中定义了类ActivityB。ActivityB继承自Activity,以activityb.xml定义的界面为显示界面。ActivityB.java内容如下:
package com.helloworld.helloworldproject; import android.app.Activity; import android.os.Bundle; public class ActivityB extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activityb); } }
7、编辑ActivityC.java。ActivityC.java中定义了类ActivityC。ActivityC继承自Activity,以activityc.xml定义的界面为显示界面。ActivityC.java内容如下:
package com.helloworld.helloworldproject; import android.app.Activity; import android.os.Bundle; import android.content.Intent; import android.view.View; import android.widget.Button; import android.widget.EditText; public class ActivityC extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activityc); Button buttonc1 = (Button)findViewById(R.id.buttonc1); buttonc1.setOnClickListener(new buttonc1_Listener()); } private class buttonc1_Listener implements View.OnClickListener { public void onClick(View v) { Intent data = new Intent(); EditText editText = (EditText)findViewById(R.id.etActivityc); String val = editText.getText().toString(); //将键值对存入Intent的对象 data.putExtra("helloworld", val); //将Intent对象传回父Activity setResult(Activity.RESULT_OK, data); //关闭当前Activity finish(); } } }
8、在AndroidManifest.xml中注册Activity。这是最容易被忽视的一步,需要注意。在AndroidManifest.xml添加以下代码:
<activity android:name="com.helloworld.helloworldproject.ActivityB"></activity> <activity android:name="com.helloworld.helloworldproject.ActivityC"></activity>