当前位置: 首页 > news >正文

华为网站建设南通门户网站建设方案

华为网站建设,南通门户网站建设方案,网站建设哪里去学,什么是网络营销调研?它有什么特点?BaseActivity 和 BaseFragment 实现,集成了 View Binding,并增加了对 Lifecycle 和 ViewModel 的支持,同时进一步简化了代码结构,使其更易用、更灵活。 启用 View Binding 确保在 build.gradle 中启用了 View Binding&#xff1a…

BaseActivity 和 BaseFragment 实现,集成了 View Binding,并增加了对 Lifecycle 和 ViewModel 的支持,同时进一步简化了代码结构,使其更易用、更灵活。

  1. 启用 View Binding
    确保在 build.gradle 中启用了 View Binding
android {...viewBinding {enabled = true}
}

2. BaseActivity

import android.os.Bundle;
import androidx.annotation.CallSuper;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import androidx.viewbinding.ViewBinding;public abstract class BaseActivity<VB extends ViewBinding, VM extends ViewModel> extends AppCompatActivity {private VB _binding;private VM _viewModel;// 提供 binding 的 getter 方法protected VB getBinding() {return _binding;}// 提供 ViewModel 的 getter 方法protected VM getViewModel() {return _viewModel;}@Override@CallSuperprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);_binding = createViewBinding();setContentView(_binding.getRoot());// 初始化 ViewModel_viewModel = new ViewModelProvider(this).get(getViewModelClass());setupViews();observeData();}// 创建 ViewBinding 实例protected abstract VB createViewBinding();// 获取 ViewModel 的 Class 类型protected abstract Class<VM> getViewModelClass();// 初始化视图protected abstract void setupViews();// 观察数据(可选)protected void observeData() {// 默认空实现,子类可按需重写}@Overrideprotected void onDestroy() {super.onDestroy();// 清理 binding 引用,避免内存泄漏_binding = null;}
}

3. BaseFragment

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.CallSuper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import androidx.viewbinding.ViewBinding;public abstract class BaseFragment<VB extends ViewBinding, VM extends ViewModel> extends Fragment {private VB _binding;private VM _viewModel;// 提供 binding 的 getter 方法protected VB getBinding() {return _binding;}// 提供 ViewModel 的 getter 方法protected VM getViewModel() {return _viewModel;}@Nullable@Override@CallSuperpublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {_binding = createViewBinding(inflater, container);return _binding.getRoot();}@Override@CallSuperpublic void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);// 初始化 ViewModel_viewModel = new ViewModelProvider(this).get(getViewModelClass());setupViews();observeData();}// 创建 ViewBinding 实例protected abstract VB createViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container);// 获取 ViewModel 的 Class 类型protected abstract Class<VM> getViewModelClass();// 初始化视图protected abstract void setupViews();// 观察数据(可选)protected void observeData() {// 默认空实现,子类可按需重写}@Overridepublic void onDestroyView() {super.onDestroyView();// 清理 binding 引用,避免内存泄漏_binding = null;}
}

4. 使用示例
MainActivity

public class MainActivity extends BaseActivity<ActivityMainBinding, MainViewModel> {@Overrideprotected ActivityMainBinding createViewBinding() {return ActivityMainBinding.inflate(getLayoutInflater());}@Overrideprotected Class<MainViewModel> getViewModelClass() {return MainViewModel.class;}@Overrideprotected void setupViews() {// 使用 binding 访问视图getBinding().textView.setText("Hello, Optimized View Binding!");// 使用 ViewModel 数据getViewModel().getLiveData().observe(this, data -> {// 更新 UI});}@Overrideprotected void observeData() {// 观察数据变化(可选)}
}

HomeFragment

public class HomeFragment extends BaseFragment<FragmentHomeBinding, HomeViewModel> {@Overrideprotected FragmentHomeBinding createViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) {return FragmentHomeBinding.inflate(inflater, container, false);}@Overrideprotected Class<HomeViewModel> getViewModelClass() {return HomeViewModel.class;}@Overrideprotected void setupViews() {// 使用 binding 访问视图getBinding().button.setOnClickListener(v -> {// 处理点击事件});// 使用 ViewModel 数据getViewModel().getLiveData().observe(getViewLifecycleOwner(), data -> {// 更新 UI});}@Overrideprotected void observeData() {// 观察数据变化(可选)}
}

5. 优化点说明
支持 ViewModel:

通过泛型参数 ,基类可以动态绑定具体的 ViewModel 类。

提供 getViewModelClass() 方法,子类只需返回 ViewModel 的 Class 类型即可。

observeData 方法

用于观察 ViewModel 中的数据变化(如 LiveData),子类可按需重写。

内存泄漏防护:

在 onDestroy(Activity)和 onDestroyView(Fragment)中清理 binding 引用,避免内存泄漏。

简化代码结构:

减少冗余代码,提高可读性和可维护性。

@CallSuper 注解:

确保子类在重写方法时调用 super,避免遗漏基类的关键逻辑。

6. 注意事项
确保布局文件的名称符合 View Binding 的命名规则(如 activity_main.xml 对应 ActivityMainBinding)。

如果某个布局不需要 Binding,可以在布局文件的根标签中添加 tools:viewBindingIgnore=“true”

通过这种方式,可以轻松在项目中集成 View Binding 和 ViewModel,并享受其带来的便利和安全性!

http://www.dtcms.com/a/457886.html

相关文章:

  • Docker安装部署本地对象存储Minio和使用指南
  • 怎么看网站是什么程序营销网站开发选哪家
  • Spring Boot综合项目实战 - 西蒙购物网
  • 西安房产网站大全注册网址在哪里注册
  • 营口网站建设wordpress 添加付款
  • 深度学习和机器学习的区别,联邦学习和隐私计算的区别
  • 98.验证二叉搜索树(二叉树算法题)
  • linux信号(2)——从“暂停咖啡机”看SIGINT:用户与程序的“紧急停止按钮”
  • asp网站安全南京移动网站建设
  • leetcode hot100 中等难度 day05-刷题
  • 企业网站每年的费用wordpress目录魔板
  • 做一个小公司网站多少钱网站备案归属地
  • Access调用Azure翻译:轻松实现系统多语言切换
  • R语言从入门到精通Day5之【数据输入】
  • 网站开发挣不挣钱南通网站建设知识
  • 仿手机底部导航栏制作
  • 二维码生成的技术原理与全场景实践
  • 做网站 嵌入支付wordpress优化攻略
  • Chromium Embedded Framework (CEF)的构建及运行
  • 批量替换yaml文件url字段
  • “软件维护” 分 4 类?用 “奶茶店售后” 讲透更正 / 适应性 / 完善性维护
  • 恋爱ppt模板免费下载网站网站建设项目风险管理的主要内容
  • 网站主机选择98建筑人才网
  • Windows中在QTCreator中调试,提示缺少debug information files问题的解决
  • 做宠物店网站的素材seo一级域名和二级域名
  • 施工工地云监管平台,工程建设现场管理,智慧工地云平台源码,以AI、物联网、BIM技术为手段,对施工现场进行立体化、全方位、全时段管理
  • 用单调栈高效解决 “首尾均为最大值” 的子数组计数问题(Leetcode 3113)
  • 企业网站自己可以做吗wordpress 登陆 插件
  • 初学c#-c#和.NET Framework - onecopper
  • 大沥南庄网站建设网站开发建设流程