Android Training - 启动另一个Activity

前面一个教程我们已经在屏幕上显示了一个文本域和一个按钮,现在你要在MainActivity中添加一些代码,实现当用户点击按钮的时候启动一个新的Activity。

响应Send按键
为了响应按键的点击事件,打开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类添加相应的函数:
    /** 当用户点击Send按钮的时候被调用 */
    public void sendMessage(View view){
    	//响应点击事件
    }

系统会自动匹配对应的函数名去响应android:onClick,所以名称必须是准确的,而且,方法必须符合下面的条件:
  • 必须的public的
  • 必须有一个void的返回值
  • 必须仅有一个View作为参数(这个view就是被点击的那个)
下一步,你要在这个函数中实现读取文本域的内容,然后发送这个内容给另外一个activity。

创建一个Intent
一个Intent是一个对象,它为两个独立的组件提供运行时绑定(比如两个activity)。一个Intent就代表一个程序“想要去做什么”,你可以使用它完成很多任务,不过最常用的就是启动另外一个activity。

在sendMessage()函数中,创建一个Intent去启动DisplayMessageActivity:
Intent intent = new Intent(this, DisplayMessageActivity.class);
这个构造函数使用两个参数:
  • 第一个参数是一个Context(使用this是因为Activity类是Context类的子类)
  • 系统需要传递Intent给一个组件的Class(这里的情况是这个activity会被启动)
提示:这个时候Eclipse中会提示一个DisplayMessageActivity引用错误,因为这个类还不存在,先忽略这个错误,我们马上就要创建这个类了。

一个intent不仅仅可以让你启动一个activity,它还可以同时携带一些数据给启动的activity。所以,我们使用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);

一个Intent可以携带各种各样类型的数据集,以key-value对的方式。putExtra()函数的第一个参数就是key,第二个参数就value。

为了下一个activity能够查询到传递过来的附加值,你需要定义key为一个公共的常量。所以在MainActivity类的顶部添加EXTRA_MESSAGE的定义:
public class MainActivity extends Activity {
	public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
……
}

使用程序的包名作为intent附加数据的key的前缀是一种很好的方式。这样可以确保当你的程序和其他程序交互的时候,它们是唯一的。

启动第二个Activity
要启动一个activity,你只要调用startActivity()函数,并传递你的Intent就可以了。系统接收到这个调用,然后启动Intent中指定的Activity的实例。

最新的sendMessage()函数的代码如下:
    /** 当用户点击Send按钮的时候被调用 */
    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:
  1. 点击工具栏上面的New图标
  2. 在出现的窗口中,打开Android文件夹,选择Android Activity,点击Next。
  3. 选择BlankActivity然后点击Next。
  4. 填写activity信息:
    Project: MyFirstApp
    Activity Name: DisplayMessageActivity
    Layout Name: activity_diaplay_message
    Navigation Type: None
    Hierarchical Parent: com.example.myfirstapp.MainActivity
    Title: My Message
    点击Finish。
Android Training - 启动另一个Activity_第1张图片
如果你使用其他的IDE或者使用命令行,创建一个名为DisplayMessageActivity.java的文件,放到和MainActivity.java相同的目录中。

打开DisplayMessageActivity.java文件,如果你使用eclipse,这个类以及包含了必要的onCreate()函数,这里也包含了onCreateOptionsMenu()函数的实现,我们还不需要它,你可以删除它,类大概是这样的:
public class DisplayMessageActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_display_message);
    }
}

所有Activity的子类都必须包含onCreate()函数的实现。当系统创建一个新的activity实例的时候会调用这个函数。这个函数是你定义activity的视图布局和进行组件初始化的地方。

把它添加到清单文件
你必须在清单文件AndroidManifest.xml中使用<activity>元素声明所有的activity。

如果你使用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.hebaijun.myfristapp.MainActivity" />
        </activity>
    </application>

这个<meta-data>元素使用程序的逻辑层次声明了这个activity的父activity的名称。Android支持库使用这种方式实现默认的导航行为,比如   Up navigation .

提示:在安装的时候,你应该已经下载了最新的支持库,Eclipse会自动包含到你的项目中(你看在JAR文件列表中看到Android Dependencies),如果不是使用eclipse,你需要手动添加这库到你的工程中,教程在这里 setting up the Support Library .

现在第一个activity中的Intent已经可以找到DisplayMessageActivity类了,所以程序可以运行了。当你运行程序,点击Send按钮启动另一个activity,但是页面还什么都不会显示。

接收Intent
不管用户是怎么导航到这里的,每个Activity都是被一个Intent调用的。你可以通过getIntent()函数取得启动你的那个activity使用的Intent,并且可以取得里面的附加值。

在DisplayMessageActivity类的onCreate()函数中,取得MainActivity传递过来的Intent和附加的message。
        Intent intent = getIntent();
        String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);

显示Message
为了显示message到屏幕,你需要创建一个TextView部件,然后使用setText()方法设置它的值。再然后通过setContentView()方法把这个TextView设置为这个activity部件的根视图。

完整的onCreate()函数如下:
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        //从Intent中取得messge
        Intent intent = getIntent();
        String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
        
        //创建text view
        TextView textView = new TextView(this);
        textView.setTextSize(40);
        textView.setText(message);
        
        // 设置textview为activity的布局
        setContentView(textView);
    }

你现在可以运行程序了,输入一个message到文本框中,点击Send按钮,这个message就会显示在另外一个activity中了。
Android Training - 启动另一个Activity_第2张图片
就这样,你已经创建好你的第一个Android程序了。

想要学习更多,请跟随我们的教程学习。下一个课程是:Activity生命周期的管理。

你可能感兴趣的:(eclipse,android,String,button,dependencies,Training)