Android Java开发:仅展示少量信息是否需要单独创建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参数渲染页面即可。
后续扩展说明
之后新增其他急救类型,只需要两步操作:
- 在
FirstAidType中新增对应的急救类型常量 - 在
FirstAidDataUtil的switch分支中新增对应case,填写对应的字符串、图片资源即可,不需要新增任何Activity。
内容的提问来源于stack exchange,提问作者Siege Elevate

