在教程学习1中,我建立了一个非常简单的显示一个Activity的用户界面。这个Activity包含一个EditView部件和一个Button部件。
这里我将会添加一些新的代码到MainActivity中,当用户点击button是启动一个新的activity。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
响应Send按钮
首先响应按钮的on-click事件,打开activity_main.xml布局文件然后在Button元素中添加andrid:onclick属性
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send"
android:onClick="sendMessage" />
android:onClick属性的值 "sendMessage"就是当用户点击屏幕按钮时触发方法的名字。
/** When click send button */
public void sendMessage(View view){
// do something in response to button
}
这里需要import View类
import android.view.View;
注意:为了能够将这个方法(sendMessage)与在android:onClick属性中提供的方法名字匹配,它们的名字必须一致,特别是
这个方法必须满足一下条件:
公共的
没有返回值
有一个唯一的视图(View)参数(这个视图就是将被点击的视图)
下一步,可以在这个方法内读取文本内容,并将该内容传到另一个Activity。
Intent
Intent(意图)实在不同组件中提供运行是连接的对象(比如两个Activity)。Intent代表一个应用“想去做什么事”,你可以用它做
各种各样的任务,不过大部分的时候它们被用来启动另一个Activity。
在sendMessage()方法中创建一个Intent来启动名为DisplayMessageActivity的Activity:
Intent intent = new Intent(this, DisplayMessageActivity.class);
在这个Intent构造函数中有连个参数:
- 第一个参数是Context(上下文)(之所有可以用this是因为Activity类是Context的子类)
- 系统需要传递Intent的应用组件的class对象(在这个案例中,就是应该被启动的Activity)
注意:此时名为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);
注意:需要import android,content.Intent & androdi.widget.EditText。同时定义一个EXTRA_MESSAGE常量。
Intent可以传递各种各样的以键值对形式出现的集合,可以称它为extras,putExtra()方法将key的名字作为第一个参数,相对应
的值作为第二个参数。
为了在下一个Acitivity中获取extra(附加的)数据,你应该定义一个公共常量作为key(键)。在MainActivity类的顶部定义一个名为
EXTRA_MESSAGE的常量:
public class MainActivity extends Activity {
public final static String EXTRA_MESSAGE = "com.edd.myfirsyproject.MESSAGE";
......
}
为了使extra键唯一,使用应用的包名作为extra键的前缀是一个很好的方法,因为你的应用可能需要跟其他的应用交互。
启动另一个Activity
启动一个Activity,只需要调用startActivity()方法然后传入你的Intent。系统接收到你的请求后会实例化在Intent中指定的Activity。
/** When click send button */
public void sendMessage(View view)
{
// do something in response to button
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText)findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(message, EXTRA_MESSAGE);
startActivity(intent);
}
创建另一个Activity类
使用Eclipes创建新的activity:
1.点击工具类中中的New
2.在出现的窗口中打开Android文件夹,选择Andorid Activity,点击Next
3.选择BlankActivity,然后点击Next
详情:
-Project: MyFirstApp
-Activity Name: DisplayMessageActivity
-Layout Name: activity_display_message
-Title: My Message
-Hierarchial Parent: com.example.myfirstapp.MainActivity
-Navigation Type: None
package com.edd.myfirsyproject;
import android.annotation.SuppressLint;
...
public class DisplayMessageActivity extends Activity {
@SuppressLint("NewApi");
@Override
protected void onCreate(Bundle savedInstanceState) {
......
}
/**
* Set up the {@link android.app.ActionBar}, if the API is available.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void setupActionBar() {
......
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
......
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
......
}
}
将Activity加入manifest(清单)文件
必须在manifest(清单)文件——AndroidManifest.xml中使用元素声明所有的Activity。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.edd.myfirsyproject"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.edd.myfirsyproject.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- A child of the main activity -->
<activity
android:name="com.edd.myfirsyproject.DisplayMessageActivity"
android:label="@string/title_activity_display_message" >
android:parentActivityName="com.edd.myfirsyproject.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.edd.myfirsyproject.MainActivity" />
</activity>
</application>
</manifest>
注意:andorid:parentActivityName属性声明了在app的逻辑层次上activity的父activity的名字。系统根据这个值来完善默认的导航行
为。因为DisplayMessageActivity是由一个明确的Intent调用的,所以它不需要任何intent filters(意图过滤器)(intent filters, 可以在
manifest文件中声明MyFirstActivity的地方看到)如此DisplayMessageActivity就可以在元素中用一句很简单的代码声明:
android:name="com.edd.myfirsyproject.DisplayMessageActivity"
这时运行app,点击send按钮启动第二个Activity,它只会显示模板提供的hello world界面。
接收Intent
每一个被Intent调用的Activity,不管用户是怎么样将它导航过来的,都可以在启动的Activity中通过getIntent()方法得到Intent以及Intent
包含的数据。
在DisplayMessageActivity类的onCreate()方法中,得到intent以及ManiActivity提供的附加消息:
// 从intent中获取信息
Intent intent= getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
打印信息
创建一个TextView部件,并使用setText()设置它的值,然后通过setContentView()方法将TextView作为root(根)视图添加到Activity
的布局。
onCreate()方法的完整代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_display_message);
// 从intent中获取信息
Intent intent= getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
// 创建TextView对象
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);
setContentView(textView);
setupActionBar();
}
现在运行app,在文本框中输入信息,点击send按钮,就可以在第二个Activity中看到信息:
输入“ddd”字母,点击send按钮