Beginner ⏱ 45 mins 阅读量 访客量

切换活动组件

J
Created by jame louis

准备工作

在此教程中,您将学习如何在Android应用中切换活动组件。

前提条件

学习内容

  • 如何创建新的活动组件
  • 如何在活动之间切换
  • 如何在活动之间传递数据

创建项目

主界面设计

  • 添加一个可编辑的文本框(EditText),文本为“张三”,居中显示,id 为 edittext_name_main
  • 添加一个按钮(Button),文本为“登入”,水平居中显示,距离文本框底部 16dp, onClick 事件为 MainAcitity.onClickLogin
  • MainActivity.java 中添加 onClickLogin 方法,用于处理按钮点击事件。
  • 配置按钮点击事件,将在屏幕上显示文本框中的内容(Toast)。

按钮点击事件绑定

activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/edittext_name_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="张三"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:onClick="onClickLogin"
        android:text="登入"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/edittext_name_main" />
</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.example.switchingactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClickLogin(View view) {
        EditText editTextName = findViewById(R.id.edittext_name_main);
        String name = editTextName.getText().toString();
        Toast.makeText(this, "你好," + name, Toast.LENGTH_SHORT).show();
    }
}

运行应用

运行应用

新建一个活动组件

新建活动组件

  • 在项目视图中,选中java文件夹,右键点击,选择New -> Activity -> Empty Activity

配置新活动组件

  • 活动名称:SecondActivity
  • 布局文件名称:activity_second
  • 包名:com.example.switchingactivity

设计第二个活动组件的布局

  • 添加一个文本视图(TextView),文本为“第二个活动组件”,居中显示,id 为 textview_name_second

最终 activity_second.xml 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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"
    tools:context=".SecondActivity">

    <TextView
        android:id="@+id/textview_name_second"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第二个活动组件"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Intent

现在,我们已经设计了第二个活动组件,加上已有的主活动组件,那么我们怎么才能从主活动组件切换到第二个活动组件呢?答案是使用 Intent。

什么是 Intent?

Intent 是 Android 中用于在不同组件之间进行通信的一种机制。它可以用于启动活动、服务、广播接收器等。在我们的例子中,我们将使用 Intent 来启动第二个活动组件。

Intent 类型

Intent 可以分为两种类型:显式 Intent 和隐式 Intent。

  • 显式 Intent:指定要启动的组件的名称。
  • 隐式 Intent:不指定要启动的组件的名称,而是根据组件的行为来确定要启动的组件。

显式 Intent

显式 Intent 是指在 Intent 中指定要启动的组件的名称。在我们的例子中,我们将使用显式 Intent 来启动第二个活动组件。

1
2
Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
  • this 表示当前活动组件的上下文。即当前活动组件的实例。
  • SecondActivity.class 表示要启动的活动组件的类名。
  • startActivity(intent) 表示启动活动组件。

集成显式 Intent 到主活动组件

  • MainActivity.java 中,添加一个 onClickLogin 方法,用于处理登录按钮的点击事件。
  • onClickLogin 方法中,创建一个 Intent 对象,指定要启动的组件为 SecondActivity.class
  • 调用 startActivity(intent) 方法启动第二个活动组件。
1
2
3
4
5
6
7
8
public void onClickLogin(View view) {
    EditText editTextName = findViewById(R.id.edittext_name_main);
    String name = editTextName.getText().toString();
    Toast.makeText(this, "你好," + name, Toast.LENGTH_SHORT).show();

    Intent intent = new Intent(this, SecondActivity.class);
    startActivity(intent);
}

运行应用

运行应用

MainActivity.java

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.example.switchingactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClickLogin(View view) {
        EditText editTextName = findViewById(R.id.edittext_name_main);
        String name = editTextName.getText().toString();
        Toast.makeText(this, "你好," + name, Toast.LENGTH_SHORT).show();

        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);
    }
}

页面切换并传递数据

上一步中,我们成功切换到了第二个活动组件。但是,我们在第一个活动组件中输入的用户名,在第二个活动组件中是看不到的。那么,我们该如何在页面切换时传递数据呢?

Intent 提供了一种机制,即可以在 Intent 中添加额外的数据,以便在目标组件中使用。

传递数据

  • onClickLogin 方法中,创建一个 Intent 对象,指定要启动的组件为 SecondActivity.class
  • 调用 putExtra 方法,将用户名添加到 Intent 中。
  • 调用 startActivity(intent) 方法启动第二个活动组件。
1
2
3
4
5
6
7
8
9
10
// MainActivity.java
public void onClickLogin(View view) {
    EditText editTextName = findViewById(R.id.edittext_name_main);
    String name = editTextName.getText().toString();
    Toast.makeText(this, "你好," + name, Toast.LENGTH_SHORT).show();

    Intent intent = new Intent(this, SecondActivity.class);
    intent.putExtra("name", name);
    startActivity(intent);
}

接收数据

  • SecondActivity.java 中,添加一个 onCreate 方法,用于接收传递过来的数据。
  • 调用 getIntent() 方法获取启动当前活动组件的 Intent 对象。
  • 调用 getStringExtra("name") 方法获取传递过来的用户名。
  • textview_name_second 中显示用户名。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.example.switchingactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Intent intent = getIntent();
        String name = intent.getStringExtra("name");

        TextView textViewName = findViewById(R.id.textview_name_second);
        textViewName.setText("你好," + name);
    }
}

运行应用

运行应用

页面切换并返回数据

StartActivityForResult

  • 定义一个常量 REQUEST_CODE,用于标识请求码。
  • 调用 startActivityForResult(intent, REQUEST_CODE) 方法启动第二个活动组件。
1
2
3
4
5
6
7
8
9
10
11
12
// MainActivity.java
public final int REQUEST_CODE = 100;

public void onClickLogin(View view) {
    EditText editTextName = findViewById(R.id.edittext_name_main);
    String name = editTextName.getText().toString();
    Toast.makeText(this, "你好," + name, Toast.LENGTH_SHORT).show();

    Intent intent = new Intent(this, SecondActivity.class);
    intent.putExtra("name", name);
    startActivityForResult(intent, REQUEST_CODE);
}

setResult

  • SecondActivity.java 中,添加一个 onClickBack 方法,用于处理返回按钮的点击事件。
  • onClickBack 方法中,创建一个 Intent 对象,指定要启动的组件为 MainActivity.class
  • 调用 setResult(RESULT_OK, intent) 方法设置返回结果为成功,并将 Intent 传递给调用方。
  • 调用 finish() 方法关闭当前活动组件。
1
2
3
4
5
6
7
// SecondActivity.java
public void onClickBack(View view) {
    Intent intent = new Intent(this, MainActivity.class);
    intent.putExtra("msg", "hello main activity from second activity");
    setResult(RESULT_OK, intent);
    finish();
}

处理返回结果

  • MainActivity.java 中,添加一个 onActivityResult 方法,用于处理第二个活动组件返回的结果。
  • 检查请求码是否与 REQUEST_CODE 匹配。
  • 检查结果码是否为 RESULT_OK
  • 从 Intent 中获取传递回来的消息。
  • 使用 Toast 显示消息。
1
2
3
4
5
6
7
8
9
10
11
// MainActivity.java
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        String name = data.getStringExtra("name");
        String msg = data.getStringExtra("msg");
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }
}

运行应用

运行应用

主要文件内容

MainActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.example.switchingactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {
    public final int REQUEST_CODE = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
            String msg = data.getStringExtra("msg");
            Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        }
    }

    public void onClickLogin(View view) {
        EditText editTextName = findViewById(R.id.edittext_name_main);
        String name = editTextName.getText().toString();
        Toast.makeText(this, "你好," + name, Toast.LENGTH_SHORT).show();

        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra("name", name);
        startActivityForResult(intent, REQUEST_CODE);
    }
}

activity_main.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/edittext_name_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:text="张三"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:onClick="onClickLogin"
        android:text="登入"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/edittext_name_main" />
</androidx.constraintlayout.widget.ConstraintLayout>

SecondActivity.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.example.switchingactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        Intent intent = getIntent();
        String name = intent.getStringExtra("name");

        TextView textViewName = findViewById(R.id.textview_name_second);
        textViewName.setText("你好," + name);
    }

    public void onClickBack(View v) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.putExtra("msg", "hello main activity from second activity");
        setResult(RESULT_OK, intent);
        finish();
    }
}

activity_second.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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"
    tools:context=".SecondActivity">

    <TextView
        android:id="@+id/textview_name_second"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第二个活动组件"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:onClick="onClickBack"
        android:text="返回"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textview_name_second" />
</androidx.constraintlayout.widget.ConstraintLayout>

总结

  • 通过Intent和StartAcitivity切换活动组件。
  • 通过Intent传递数据和接收返回结果。
  • 通过StartActivityForResult切换活动组件并通过onActivityResult接收返回结果。
  • 通过setResult设置返回结果。

评论

有疑问或建议?请在下方评论区留言!