第四个项目——消息发送

实验目的

  • 掌握AndroidManifest.xml配置清单文件的结构;

  • 掌握使用Intent显式启动Activity的方式;

  • 掌握如何为Activity添加返回父Activity的方法;

实验要求

  • 能通过Intent对象向Activity传递数据;

实验内容

步骤一,创建Android工程

打开Android Studio创建名为Code04的工程,选择Empty Activity模板。

步骤二,修改activity_main.xml布局

2.1activity_main.xml中,删除掉默认创建的TextView控件标签,新增EditTextButton控件标签各一个。

2.2 由于activity_main.xml顶层容器默认是ConstraintLayout(约束布局),因此我们设置EditTextButton控件的布局属性,如下代码所示。

<?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给出,其中XXXXYYYY可选值 包括:Start、 End、 Top、 Bottom、Right、 Left等。而其属性值则为在该布局文件中的某一控件。

如下代码所示,对于EditText的约束布局属性设置,表示该控件左侧(Start)与父控件(parent) 的左侧(Start)对齐、该控件的顶部(Top)与父控件的顶部(Top)对齐、该控件的右侧(End)与idsend_messageButton控件的左侧对齐。

...
    <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.1Android StudioProject工具窗口中右击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 要将MainActivityEditText用户输入的消息传递给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()方法, 该方法取得启动ActivityIntent对象,再使用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(约束布局)进行布局管理;

  • 设置EditText单行文本模式属性;

  • 使用显式Intent启动Activity

  • 使用IntentActivity之间传递数据;

Last updated

Was this helpful?