实验目的
掌握AndroidManifest.xml配置清单文件的结构;
掌握使用Intent显式启动Activity的方式;
掌握如何为Activity添加返回父Activity的方法;
实验要求
能通过Intent对象向Activity传递数据;
实验内容
步骤一,创建Android工程
打开Android Studio创建名为Code04的工程,选择Empty Activity模板。
步骤二,修改activity_main.xml布局
2.1 在activity_main.xml中,删除掉默认创建的TextView控件标签,新增EditText、Button控件标签各一个。
2.2 由于activity_main.xml顶层容器默认是ConstraintLayout(约束布局),因此我们设置EditText、 Button控件的布局属性,如下代码所示。
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
tools:context=".MainActivity">
<EditText
android:id="@+id/message"
android:layout_width="0dp"
android:hint="Enter a message"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toStartOf="@+id/send_message"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/send_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="Send Message"
app:layout_constraintBaseline_toBaselineOf="@+id/message"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/message" />
</android.support.constraint.ConstraintLayout>
约束布局的属性由xmlns:app="http://schemas.android.com/apk/res-auto"命名空间进行引入,因此均以app开头。
约束布局的属性名以app:layout_constraint[XXXX]_to[YYYY]Of给出,其中XXXX、YYYY可选值 包括:Start、 End、 Top、 Bottom、Right、 Left等。而其属性值则为在该布局文件中的某一控件。
如下代码所示,对于EditText的约束布局属性设置,表示该控件左侧(Start)与父控件(parent) 的左侧(Start)对齐、该控件的顶部(Top)与父控件的顶部(Top)对齐、该控件的右侧(End)与id为send_message的Button控件的左侧对齐。
...
<EditText
android:id="@+id/message"
...
app:layout_constraintEnd_toStartOf="@+id/send_message"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/send_message"
... />
对于一个控件的约束布局属性,在其垂直及水平方向上至少需要指定一个约束属性。常用的约束布局属性包括:
app:layout_constraintTop_toTopOf
app:layout_constraintTop_toBottomOf
app:layout_constraintStart_toEndOf
app:layout_constraintEnd_toStartOf
app:layout_constraintEnd_toEndOf
app:layout_constraintBottom_toTopOf
app:layout_constraintBottom_toBottomOf
步骤三,添加Send Message按钮点击事件侦听器
为Send Message按钮添加点击事件侦听器,用户点击该按钮时,使用Toast快显消息将EditText中输入的文本进行显示。 代码如下所示,运行结果如图1. Code04 运行效果
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText etMessage = findViewById(R.id.message);
Button btSend = findViewById(R.id.send_message);
btSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String message = etMessage.getText().toString();
Toast.makeText(MainActivity.this,
message, Toast.LENGTH_SHORT).show();
}
});
}
}
步骤四,新增MessageActivity活动
4.1 在Android Studio的Project工具窗口中右击app模块选择【New】->【Activity】->【Empty Activity】。 将新的活动命名为\textbf{MessageActivity},完成后,在AndroidManifest.xml配置文件中,你将看到两个已注册的Activity, 代码如下所示。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.glriverside.xgqin.code04">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MessageActivity"></activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
4.2 要将MainActivity中EditText用户输入的消息传递给MessageActivity,我们需要在Send Message按钮点击事件 侦听器中使用Intent启动MessageActivity活动。
启动Activity可以使用startActivity()方法,该方法接受一个Intent(意图)参数。其Intent可以为 隐式Intent及显式Intent,在本例中使用显式Intent方式启动MessageActivity, 代码如下所示。为了将EditText中用户输入的消息传递给MessageActivity, 我们使用Intent对象中的putExtra()方法,该方法接收key-value(键值对)形式的参数。
public class MainActivity extends AppCompatActivity {
public static final String MESSAGE_STRING =
"com.glriverside.xgqin.code04.MESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
btSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String message = etMessage.getText().toString();
Intent intent = new Intent(MainActivity.this,
MessageActivity.class);
intent.putExtra(MESSAGE_STRING, message);
startActivity(intent);
}
});
}
}
4.3 要在MessageActivity中取出启动该Activity时传入的Message值,需要getIntent()方法, 该方法取得启动Activity的Intent对象,再使用Intent对象的getStringExtra()方法取得传入的 Message值,代码如下所示。
public class MessageActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message);
TextView tvMessage = findViewById(R.id.message);
Intent intent = getIntent();
String message = intent.getStringExtra(
MainActivity.MESSAGE_STRING);
if (message != null) {
if (tvMessage != null) {
tvMessage.setText(message);
}
}
}
}
MessageActivity的布局文件代码如下所示,App最终运行效果如图2. Code04 最终运行效果所示。
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
...>
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Message form MainActivity"
android:textColor="@color/colorAccent"
android:textSize="24sp"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
实验小结
通过本次实验,你应该掌握了如下知识内容:
使用ConstraintLayout(约束布局)进行布局管理;