Android屏幕调光场景下PCIActivity如何高效修改关联Fragment背景色
实现方案推荐
方案1:基类定义监听接口(最优,耦合度最低、性能最好)
这个方案不需要基类感知子类页面的Fragment存在,完全解耦,后续扩展不用修改基类逻辑:
- 在
PCIActivity中定义调光状态回调接口,同时维护监听队列:
public class PCIActivity extends AppCompatActivity { // 调光状态回调接口 public interface OnDimmingStateChangeListener { void onDimmingStateChanged(boolean isDimmed); } private final List<OnDimmingStateChangeListener> dimmingListeners = new ArrayList<>(); // 提供注册/注销方法 public void registerDimmingListener(OnDimmingStateChangeListener listener) { if (listener != null && !dimmingListeners.contains(listener)) { dimmingListeners.add(listener); } } public void unregisterDimmingListener(OnDimmingStateChangeListener listener) { dimmingListeners.remove(listener); } // 你原有调光逻辑触发时调用这个方法通知所有监听者 private void notifyDimmingState(boolean isDimmed) { for (OnDimmingStateChangeListener listener : dimmingListeners) { listener.onDimmingStateChanged(isDimmed); } } // ... 原有其他逻辑 }
- 每个需要响应调光的Fragment实现该接口,在生命周期里绑定/解绑监听,自行处理背景色修改:
public class YourFragment extends Fragment implements PCIActivity.OnDimmingStateChangeListener { // 存储Fragment原本的背景色,用于恢复亮度时还原 private int originalBackgroundColor; @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // 初始化时记录原本的背景色 Drawable background = view.getBackground(); if (background instanceof ColorDrawable) { originalBackgroundColor = ((ColorDrawable) background).getColor(); } } @Override public void onStart() { super.onStart(); // 注册监听 if (getActivity() instanceof PCIActivity) { ((PCIActivity) getActivity()).registerDimmingListener(this); } } @Override public void onStop() { super.onStop(); // 注销监听避免内存泄漏 if (getActivity() instanceof PCIActivity) { ((PCIActivity) getActivity()).unregisterDimmingListener(this); } } @Override public void onDimmingStateChanged(boolean isDimmed) { // 自行修改自身背景色,逻辑完全由Fragment自己控制 if (isDimmed) { // 调暗时叠加半透明黑色遮罩,或者直接改成你需要的暗色 requireView().setBackgroundColor(Color.parseColor("#88000000")); } else { requireView().setBackgroundColor(originalBackgroundColor); } } }
这个方案的优势:
- 基类和Fragment完全解耦,互不依赖对方的内部实现
- 后续新增需要响应调光的页面/组件,只需要实现接口注册监听即可,不用修改基类代码
- 性能开销极低,仅为普通接口回调,没有多余的IPC或者反射开销
备选方案:本地广播实现
如果需要跨多个独立组件监听调光状态,可以用本地广播实现,不用组件之间互相持有引用:
PCIActivity调光状态变化时发送本地广播:
private void notifyDimmingState(boolean isDimmed) { Intent intent = new Intent("your.app.action.DIMMING_STATE_CHANGE"); intent.putExtra("is_dimmed", isDimmed); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); }
- 每个Fragment注册对应广播接收器,收到广播后修改背景即可,注意在生命周期结束时注销接收器。
不推荐直接在基类中获取Fragment实例修改的方案,会导致基类和子类页面逻辑强耦合,后续页面变动需要频繁修改基类代码。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

