首页 > 基础资料 博客日记
Android复杂页面组件化策略
2026-04-02 10:00:03基础资料围观1次
文章Android复杂页面组件化策略分享给大家,欢迎收藏极客资料网,专注分享技术知识
常见方案对比
| 方案 | 适用场景 | 特点 |
|---|---|---|
| include 布局 | 静态拆分,不需要复用 | 简单,布局复用 |
| 自定义 View | UI+逻辑封装,可复用 | 封装度高 |
| Fragment | 动态加载,独立生命周期 | 灵活,但复杂 |
| RecyclerView | 列表,每行算一个组件 | 最常用 |
实际建议
复杂页面(如患者详情页)
├── 患者基本信息卡片 → include 或 自定义 CardView
├── 医嘱列表区域 → RecyclerView + Adapter
├── 执行记录区域 → RecyclerView + Adapter
├── 备注信息区域 → include
└── 底部操作栏 → include
不是越拆越好:
- 2-3 个简单区域 → 直接写一个 XML
- 重复使用的区域 → 抽成 include 或自定义 View
- 需要独立管理生命周期 → Fragment
- 列表类型 → RecyclerView
多组件编码示例
示例场景:登录页拆分
LoginActivity
├── 顶部 Logo 区域(LogoView)
├── 账号输入区域(AccountInputView)
├── 验证码区域(CaptchaView)
└── 登录按钮区域(LoginButtonView)
方案 A:include + ViewBinding(简单拆分)
activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<!-- 顶部 Logo -->
<include
android:id="@+id/layout_logo"
layout="@layout/layout_login_logo" />
<!-- 账号输入 -->
<include
android:id="@+id/layout_account"
layout="@layout/layout_account_input" />
<!-- 验证码 -->
<include
android:id="@+id/layout_captcha"
layout="@layout/layout_captcha" />
<!-- 登录按钮 -->
<include
android:id="@+id/layout_login_btn"
layout="@layout/layout_login_button" />
</LinearLayout>
LoginActivity.java
public class LoginActivity extends BaseActivity<ActivityLoginBinding> {
@Override
protected void initView(Bundle savedInstanceState) {
// 每个子布局都可以单独操作
binding.layoutLogo.setLogo(R.drawable.ic_logo);
binding.layoutAccount.setHint("请输入账号");
binding.layoutCaptcha.setOnRefreshListener(() -> viewModel.loadCaptcha());
binding.layoutLoginBtn.setOnClickListener(() -> submitLogin());
}
@Override
protected void observeViewModel() {
// 集中管理所有 LiveData
viewModel.getCaptchaState().observe(this, resource -> {
if (resource.isSuccess()) {
binding.layoutCaptcha.setImage(resource.getData().imageBase64);
}
});
}
}
方案 B:自定义 View(封装业务逻辑)
适合复杂且可复用的组件,比如验证码组件:
CaptchaView.java(自定义组件)
public class CaptchaView extends LinearLayout {
private ActivityCaptchaBinding binding;
private OnRefreshListener refreshListener;
public CaptchaView(Context context) {
super(context);
init();
}
private void init() {
binding = ActivityCaptchaBinding.inflate(LayoutInflater.from(getContext()), this, true);
binding.btnRefresh.setOnClickListener(v -> {
if (refreshListener != null) refreshListener.onRefresh();
});
}
/** 设置验证码图片 */
public void setCaptchaImage(String base64) {
// Base64 → Bitmap → 设置图片
}
/** 获取用户输入的验证码 */
public String getCaptchaCode() {
return binding.etCaptcha.getText().toString().trim();
}
/** 清空输入 */
public void clear() {
binding.etCaptcha.setText("");
}
/** 显示加载中 */
public void showLoading() {
binding.progressBar.setVisibility(View.VISIBLE);
}
public void setOnRefreshListener(OnRefreshListener listener) {
this.refreshListener = listener;
}
public interface OnRefreshListener {
void onRefresh();
}
}
activity_login.xml(使用自定义组件)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<!-- 直接使用自定义组件! -->
<com.xx.xxxxx.widget.CaptchaView
android:id="@+id/captchaView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
LoginActivity.java(更简洁)
public class LoginActivity extends BaseActivity<ActivityLoginBinding> {
@Override
protected void initView(Bundle savedInstanceState) {
// 验证码组件的逻辑封装在 CaptchaView 内部
binding.captchaView.setOnRefreshListener(() -> viewModel.loadCaptcha());
}
@Override
protected void observeViewModel() {
viewModel.getCaptchaState().observe(this, resource -> {
if (resource.isSuccess()) {
binding.captchaView.setCaptchaImage(resource.getData().imageBase64);
}
});
}
private void submitLogin() {
String captcha = binding.captchaView.getCaptchaCode();
// ...
}
}
方案 C:Fragment(动态拆分)
适合需要独立管理生命周期的场景:
// PatientDetailActivity 使用多个 Fragment
public class PatientDetailActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState == null) {
// 动态添加 Fragment
getSupportFragmentManager().beginTransaction()
.add(R.id.container_info, new PatientInfoFragment())
.add(R.id.container_orders, new OrderListFragment())
.add(R.id.container_records, new RecordListFragment())
.commit();
}
}
}
总结
| 场景 | 应用 |
|---|---|
| 复杂页面拆分 |
|
| 多组件编码 |
|
实际项目中:
- 登录页这种简单页面 → 直接写一个 XML + Activity
- 详情页 → include 抽公共部分
- 列表页 → RecyclerView + 多类型 ViewHolder
- Tab 切换 → Fragment
文章来源:https://www.cnblogs.com/rion1234567/p/19809926
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:

