You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Java开发:仅展示少量信息是否需要单独创建Activity?

提问:Android单Activity动态加载内容实现多急救教程展示

嗨,我是一名Android开发新手,目前正在摸索相关知识,我已经卡了好几天,想实现仅创建1个Activity,根据用户点击的按钮动态变更其内容的效果。
我正在开发一款小型急救类APP,包含15-25个按钮,每个按钮对应不同的急救教程,请问最优实现方案是什么?
目前我已经实现了按钮列表,点击后跳转至新Activity:
按钮列表
点击“烧伤”按钮后会弹出对应的处理步骤,每个步骤可点击,跳转至新Activity展示带图片、视频的详细说明:
点击烧伤按钮后效果
我之前尝试过只用1个Activity,通过intent.putExtra()传递数据,但遇到的问题是每个步骤的跳转目标无法动态修改:步骤的展示内容可以变更,但点击后始终跳转到烧伤步骤对应的详情页。
我相信一定有更优的实现方式,不用每次点击按钮都新建Activity来展示少量信息。希望大家能帮忙解答,我是新手,麻烦尽量讲解得详细易懂,非常感谢。

现有代码

list_of_firstAid.java

buttonBurns.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(getActivity(), burnsActivity.class);
        intent.putExtra("procedure_1", getResources().getString(R.string.burns_procedure_1));
        intent.putExtra("procedure_2", getResources().getString(R.string.burns_procedure_2));
        intent.putExtra("procedure_3", getResources().getString(R.string.burns_procedure_3));
        intent.putExtra("procedure_4", getResources().getString(R.string.burns_procedure_4));
        intent.putExtra("procedure_5", getResources().getString(R.string.burns_procedure_5));
        intent.putExtra("note_procedure_1", getResources().getString(R.string.burns_note_1));
        startActivity(intent);
    }
});

burnsActivity.java

public void process(View view){
    if(view.getId() == R.id.burnsStep1)
    {
        Intent intent = new Intent(burnsActivity.this, displayInfoActivity.class);
        intent.putExtra("step_1", getResources().getString(R.string.firstaid_burnsactivity_information_number_1_bullet_1));
        intent.putExtra("image_1", R.drawable.round_bk2);
        intent.putExtra("step_2", "this is step 2");
        startActivity(intent);
    }
    else if(view.getId() == R.id.burnsStep2)
    {
        Intent intent = new Intent(burnsActivity.this, displayInfoActivity.class);
        intent.putExtra("step_1", getResources().getString(R.string.firstaid_burnsactivity_information_number_2_bullet_1));
        intent.putExtra("image_1", R.drawable.round_bk3;
        intent.putExtra("step_2", "");
        startActivity(intent);
    }
    else if (view.getId() == R.id.burnsStep3)
    {
        Intent intent = new Intent(burnsActivity.this, displayInfoActivity.class);
        intent.putExtra("step_1", getResources().getString(R.string.firstaid_burnsactivity_information_number_3_bullet_1));
        intent.putExtra("image_1", R.drawable.round_bk5);
        intent.putExtra("step_2", getResources().getString(R.string.firstaid_burnsactivity_information_number_3_bullet_2));
        startActivity(intent);
    }
    else if (view.getId() == R.id.burnsStep4)
    {
        Intent intent = new Intent(burnsActivity.this, displayInfoActivity.class);
        intent.putExtra("step_1", getResources().getString(R.string.firstaid_burnsactivity_information_number_4_bullet_1));
        intent.putExtra("image_1", R.drawable.round_bk5);
        intent.putExtra("step_2", getResources().getString(R.string.firstaid_burnsactivity_information_number_4_bullet_2));
        startActivity(intent);
    }
    else if (view.getId() == R.id.burnsStep5)
    {
        Intent intent = new Intent(burnsActivity.this, displayInfoActivity.class);
        intent.putExtra("step_1", getResources().getString(R.string.firstaid_burnsactivity_information_number_5_bullet_1));
        intent.putExtra("image_1", R.drawable.round_bk5);
        intent.putExtra("step_2", getResources().getString(R.string.firstaid_burnsactivity_information_number_5_bullet_2));
        startActivity(intent);
    }
    else if (view.getId() == R.id.burnsNote1)
    {
        Intent intent = new Intent(burnsActivity.this, displayInfoActivity.class);
        intent.putExtra("step_1", getResources().getString(R.string.firstaid_burnsactivity_information_number_6_bullet_1));
        intent.putExtra("image_1", R.drawable.round_bk5);
        intent.putExtra("step_2", getResources().getString(R.string.firstaid_burnsactivity_information_number_6_bullet_2));
        startActivity(intent);
    }
}

补充说明

上述代码可以修改每个步骤的展示信息,但这些步骤本身是可点击的。比如我复用这个Activity处理“出血”相关内容时,每个步骤的文本可以正常修改,但点击步骤后还是展示burnsActivity中设置的烧伤相关内容。
示例图


解决方案

你的问题核心是burnsActivity中的点击逻辑写死了读取烧伤相关的字符串资源,所以即使你动态修改了步骤展示的文本,点击事件还是会加载固定的烧伤内容。最优方案是通过「数据模型封装+通用Activity复用」实现,全程只需要3个Activity:按钮列表页、通用步骤展示页、通用详情页,不用为每一种急救类型单独创建Activity。

实现步骤

1. 定义数据实体类

首先创建两个Java类封装所有急救相关的数据,避免每次传N个extra参数。

StepDetail.java(步骤详情数据)

import java.io.Serializable;

public class StepDetail implements Serializable {
    private String step1Text;
    private int imageRes;
    private String step2Text;

    // 构造方法、get方法
    public StepDetail(String step1Text, int imageRes, String step2Text) {
        this.step1Text = step1Text;
        this.imageRes = imageRes;
        this.step2Text = step2Text;
    }

    public String getStep1Text() { return step1Text; }
    public int getImageRes() { return imageRes; }
    public String getStep2Text() { return step2Text; }
}

FirstAidType.java(急救类型全量数据)

import java.io.Serializable;
import java.util.List;

public class FirstAidType implements Serializable {
    // 急救类型常量定义
    public static final int TYPE_BURN = 0; // 烧伤
    public static final int TYPE_BLEED = 1; // 出血
    // 后续新增急救类型在此处加常量即可

    private String[] procedureList; // 步骤列表展示文本
    private List<StepDetail> stepDetailList; // 每个步骤对应的详情数据

    public FirstAidType(String[] procedureList, List<StepDetail> stepDetailList) {
        this.procedureList = procedureList;
        this.stepDetailList = stepDetailList;
    }

    public String[] getProcedureList() { return procedureList; }
    public List<StepDetail> getStepDetailList() { return stepDetailList; }
}

2. 创建数据工具类统一管理资源

把所有急救类型的资源读取逻辑集中在一起,避免在各个Activity里重复写资源获取代码。

import android.content.Context;
import java.util.ArrayList;
import java.util.List;

public class FirstAidDataUtil {
    public static FirstAidType getFirstAidData(Context context, int type) {
        String[] procedureList;
        List<StepDetail> detailList = new ArrayList<>();
        switch (type) {
            case FirstAidType.TYPE_BURN:
                // 加载烧伤相关数据
                procedureList = new String[]{
                    context.getString(R.string.burns_procedure_1),
                    context.getString(R.string.burns_procedure_2),
                    context.getString(R.string.burns_procedure_3),
                    context.getString(R.string.burns_procedure_4),
                    context.getString(R.string.burns_procedure_5),
                    context.getString(R.string.burns_note_1)
                };
                detailList.add(new StepDetail(context.getString(R.string.firstaid_burnsactivity_information_number_1_bullet_1), R.drawable.round_bk2, "this is step 2"));
                detailList.add(new StepDetail(context.getString(R.string.firstaid_burnsactivity_information_number_2_bullet_1), R.drawable.round_bk3, ""));
                detailList.add(new StepDetail(context.getString(R.string.firstaid_burnsactivity_information_number_3_bullet_1), R.drawable.round_bk5, context.getString(R.string.firstaid_burnsactivity_information_number_3_bullet_2)));
                detailList.add(new StepDetail(context.getString(R.string.firstaid_burnsactivity_information_number_4_bullet_1), R.drawable.round_bk5, context.getString(R.string.firstaid_burnsactivity_information_number_4_bullet_2)));
                detailList.add(new StepDetail(context.getString(R.string.firstaid_burnsactivity_information_number_5_bullet_1), R.drawable.round_bk5, context.getString(R.string.firstaid_burnsactivity_information_number_5_bullet_2)));
                detailList.add(new StepDetail(context.getString(R.string.firstaid_burnsactivity_information_number_6_bullet_1), R.drawable.round_bk5, context.getString(R.string.firstaid_burnsactivity_information_number_6_bullet_2)));
                return new FirstAidType(procedureList, detailList);
            case FirstAidType.TYPE_BLEED:
                // 按相同格式填写出血相关的字符串、图片资源即可
                break;
            // 后续新增急救类型只需要加对应case
        }
        return null;
    }
}

3. 修改列表页的点击逻辑

所有急救按钮都跳同一个通用步骤页,仅传递急救类型常量即可。

// 烧伤按钮点击逻辑
buttonBurns.setOnClickListener(v -> {
    Intent intent = new Intent(getActivity(), CommonStepActivity.class);
    intent.putExtra("first_aid_type", FirstAidType.TYPE_BURN);
    startActivity(intent);
});
// 出血按钮点击逻辑
buttonBleed.setOnClickListener(v -> {
    Intent intent = new Intent(getActivity(), CommonStepActivity.class);
    intent.putExtra("first_aid_type", FirstAidType.TYPE_BLEED);
    startActivity(intent);
});
// 其他急救按钮同理,仅修改传递的type常量即可

4. 实现通用步骤页CommonStepActivity

替换你原来的burnsActivity,可直接复用原有布局文件,动态加载数据绑定点击事件。

import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class CommonStepActivity extends AppCompatActivity {
    private FirstAidType currentAidData;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 直接复用你原来burnsActivity的布局即可,不需要修改布局id
        setContentView(R.layout.activity_burns);

        // 获取传递的急救类型
        int aidType = getIntent().getIntExtra("first_aid_type", -1);
        currentAidData = FirstAidDataUtil.getFirstAidData(this, aidType);

        // 绑定布局控件
        TextView step1 = findViewById(R.id.burnsStep1);
        TextView step2 = findViewById(R.id.burnsStep2);
        TextView step3 = findViewById(R.id.burnsStep3);
        TextView step4 = findViewById(R.id.burnsStep4);
        TextView step5 = findViewById(R.id.burnsStep5);
        TextView note1 = findViewById(R.id.burnsNote1);

        // 渲染步骤展示文本
        String[] procedures = currentAidData.getProcedureList();
        step1.setText(procedures[0]);
        step2.setText(procedures[1]);
        step3.setText(procedures[2]);
        step4.setText(procedures[3]);
        step5.setText(procedures[4]);
        note1.setText(procedures[5]);

        // 绑定点击事件,点击时传递对应位置的详情数据
        step1.setOnClickListener(v -> jumpToDetail(0));
        step2.setOnClickListener(v -> jumpToDetail(1));
        step3.setOnClickListener(v -> jumpToDetail(2));
        step4.setOnClickListener(v -> jumpToDetail(3));
        step5.setOnClickListener(v -> jumpToDetail(4));
        note1.setOnClickListener(v -> jumpToDetail(5));
    }

    private void jumpToDetail(int position) {
        StepDetail detail = currentAidData.getStepDetailList().get(position);
        Intent intent = new Intent(this, displayInfoActivity.class);
        intent.putExtra("step_1", detail.getStep1Text());
        intent.putExtra("image_1", detail.getImageRes());
        intent.putExtra("step_2", detail.getStep2Text());
        startActivity(intent);
    }
}

5. 原有详情页无需修改

你已经实现的displayInfoActivity可以直接复用,正常接收extra参数渲染页面即可。

后续扩展说明

之后新增其他急救类型,只需要两步操作:

  1. 在FirstAidType中新增对应的急救类型常量
  2. 在FirstAidDataUtil的switch分支中新增对应case,填写对应的字符串、图片资源即可,不需要新增任何Activity。

内容的提问来源于stack exchange,提问作者Siege Elevate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:06:02