在前面的学习中,我们已经创建好了一个拥有一个文本域和一个按钮的Activity。今天的学习任务就是在MyActivity中加入一些代码,当用户点击按钮的时候跳转到另外一个Activity页面。
按钮的响应事件
要实现上面的功能,我们首先需要做的就是学习怎么去响应按钮的点击事件。
第一步:打开我们的activity_my.xml,然后给Button加入android:onClick属性,顾名思义,“onClick”的含义就是“当点击时”,这个属性对应的属性值就是一个在对应的Activity页面代码中的一个方法名称,当用户点击按钮的时候,Android系统会帮我们执行这个方法。
<Button
android:id="@+id/btn_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/btn_send"
android:onClick="sendMessage"/>
第二步:在MyActivity.java文件中添加sendMessage()方法,当按钮被点击时,弹出一个Toast提示。
/**
* 点击"发送"按钮的回调方法
* 注意:这个方法必须是
* public修饰
* 返回值必须是void
* 参数必须是View
* @param view 触发回调方法的View
*/
public void sendMessage(View view){
Toast.makeText(this,getString(R.string.txt_click_send_btn),Toast.LENGTH_SHORT).show();
}
注意方法注释部分的说明。这里我们用到了字符串资源txt_click_send_btn,它定义在res/value/strings.xml中:
<string name="txt_click_send_btn">发送按钮被点击了</string>
现在,我们看看效果:
好了,现在按钮的点击响应我们已经实现了,那么接下来就是该跳转到另外一个Activity了。
创建第二个Activity - SecondActivity
选中我们的项目包,点击鼠标右键,选择New - > Activity ->BlankActivity,类似于前面我们学的,我们设置ActivityName为SecondActivity,然后直接点击Finish,系统就帮我们创建好了SecondActivity.java和activity_second.xml。
注意:所有的Activity的子类都必须重写onCreate()方法,而且,我们必须在onCreate()方法中调用setContentView()方法,关联Activity页面对应的layout布局文件。
现在我们来改写系统为我们生成的activity_second.xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:textColor="#0000FF"/>
</LinearLayout>
这里我们使用了一个文本显示控件
TextView,并且使用它的
android:textSize和
android:textColor属性设置它的文字大小为15sp,文字颜色为蓝色。它可以用来显示我们从第一个页面传递过来的数据。
创建一个Intent
现在,两个Activity页面都已经有了,我们要怎么跳转呢?要想在当前的Activity页面打开另外一个Activity,我们需要借助一样东西,这个东西就是Intent,我们可以称之为“意图”,我们取创建一个“意图”,一个希望从当前页面到另外一个页面的”意图“:
public void sendMessage(View view){
Intent intent = new Intent(this,SecondActivity.class);
}
这样,我们的意图就已经创建好了(提一下:在Android Studio中,我们使用Alt + Enter导入包),然后我们要怎么去将这个意图发送出去呢?我们需要通过Activity类中的
startActivity()方法将这个Intent发送出去。如下:
public void sendMessage(View view){
Intent intent = new Intent(this,SecondActivity.class);
startActivity(intent);
}
代码就这么点,我们去看看效果:
这时候点击按钮,已经能跳转到SecondActivity页面了,虽然第二个页面上面内容都没有,现在我们要做的就是,将第一个页面里用户在文本域中输入的内容传递到SecondActivity页面。我们明确下我们要做的事情:
首先,第一步:我们必须获取到第一个页面中的文本域的View对象
第二步:我们必须通过这个文本域的View对象获取到用户输入的内容
第三步:将获取到的内容通过Intent传递到第二个页面
现在我们按照上面的思路继续去修改我们的代码:
public void sendMessage(View view){
Intent intent = new Intent(this,SecondActivity.class);
//第一步、通过Activity的findViewById()获取文本域EditText对象 由于findViewById()方法的返回值
// 是一个View对象 所以我们需要将其向下转型为为文本域EditText对象 参数ID是我们在layout文件activity_my.xml
//中给文本域设置的android:id属性的值
EditText edit_messgae = (EditText) findViewById(R.id.edit_message);
//第二步、通过getText().toString()方法获取到文本域中用户输入的内容
String message = edit_messgae.getText().toString();
//第三步、将用户输入的内容通过Intent的putExtra()方法封装进Intent中,随着Intent传递到下一个页面
//其中的MessageKey就相当于一个房间号,我们通过putExtra()将数据放到了对应的房间中,
//当取数据时,你要通过这个房间号才能从Intent对应的房间中取出对应的数据
intent.putExtra("MessageKey",message);
startActivity(intent);
}
上面的步骤在注释中已经写得很清楚了,这个时候我们就可以去第二个页面中取数据并且显示到文本框中了。同样,我们分析步骤如下:
第一步:首先我们需要截取到上一个页面传递过来的Intent。因为我们需要的数据在它的"MessageKey房间"里面。
第二步:从Intent中取出数据
第三步:获取到文本框TextView的对象
第四步:将从Intent中取出的内容显示到将文本框TextView上
按照上面的步骤,编写SecondActivity.java中的代码:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
//第一步 通过getIntent()方法获取从第一个页面传递过来的Intent
Intent intent = getIntent();
//根据上一个页面协商好的“房间号”从Intent中取出数据
String message = intent.getStringExtra("MessageKey");
//第三步:通过findViewById()方法获取到文本框TextView的对象
TextView tv_info = (TextView) findViewById(R.id.tv_info);
//第四步:将从Intent中取出的内容显示到将文本框TextView上
tv_info.setText(message);
}
}
好了,现在我们看看APP运行效果:
第一个页面的数据已经成功地传递到第二个页面并且显示。
特别注意
在这个项目中,我们在创建第二个Activity页面文件的时候,是通过Android studio提供的New -> Activity -> Blank Activity来完成的,这其中系统帮我们做了很多的工作,比如说,创建SecondActivity.java文件、创建layout布局资源文件、另外还有最重要也是我们新手最容易忽略的一点 : 向项目配置文件AndroidManifest.xml中注册我们新创建的Activity页面组件!
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jim.myfirstproject" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >
<activity
android:name=".MyActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".SecondActivity"
android:label="@string/title_activity_second"
>
</activity>
</application>
</manifest>
其中的
<activity
android:name=".SecondActivity"
android:label="@string/title_activity_second"
>
</activity>
部分是我们通过New -> Activity -> Blank Activity创建SecondActivity页面的时候系统帮我们注册的。而且我们项目中用到的每一个Activity都必须在这个文件中注册,否则在我们跳转页面的时候,系统将无法找到我们的Activity。现在我们删除掉系统帮我们的注册信息,再运行APP,会出现如下错误:
再次提示:项目中用到的每一个Activity都必须在AndroidManifest.xml文件中注册