网页设计与制作实例教程第2版答案/seo课堂

网页设计与制作实例教程第2版答案,seo课堂,wordpress主题哪个好,做母婴的网站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.mzph.cn/news/898021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

剖析sentinel的限流和熔断

sentinel的限流和熔断 前言源码分析滑动窗口源码限流源码熔断源码 完结撒花&#xff0c;sentinel源码还是挺简单的&#xff0c;如有需要收藏的看官&#xff0c;顺便也用发财的小手点点赞哈&#xff0c;如有错漏&#xff0c;也欢迎各位在评论区评论&#xff01; 前言 平时发起一…

硬盘分区误删后的数据救赎

一、硬盘分区误删的概述 硬盘分区误删&#xff0c;是许多电脑用户在使用过程中可能遭遇的棘手问题。分区&#xff0c;作为硬盘上存储数据的逻辑单元&#xff0c;一旦被误删除&#xff0c;不仅会导致该分区内的所有数据瞬间消失&#xff0c;还可能影响到整个硬盘的存储结构和数…

老牌软件,方便处理图片,量大管饱。

今天介绍的图片查看器名字是&#xff1a;FastStone Image Viewer&#xff0c;是一款可查看、编辑、批量重命名、批量转换的图片查看软件。文末有分享链接。 软件以资源管理器的方式管理你电脑里的图片&#xff0c;点击左侧可选择文件夹&#xff0c;右边可预览图片。 软妹用得最…

Python进阶编程总结

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

Redis复制(replica)主从模式

Redis主从复制 Redis 的复制&#xff08;replication&#xff09;功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品&#xff0c;其中被复制的服务器为主服务器&#xff08;master&#xff09;&#xff0c;而通过复制创建出来的服务器复制品则为从服务器&#…

R语言零基础系列教程-03-RStudio界面介绍与关键设置

代码、讲义、软件回复【R语言03】获取。 设置位置: 菜单栏 - Tools - Blobal Options 设置 通用设置 设置面板左侧General选项 版本选择: 一般只用一个版本即可 默认工作目录设置: 你希望RStudio打开时是基于哪个目录进行工作可以不设置, 因为脚本一般都是放置在特定项目路…

微信小程序刷题逻辑实现:技术揭秘与实践分享

页面展示&#xff1a; 概述 在当今数字化学习的浪潮中&#xff0c;微信小程序以其便捷性和实用性&#xff0c;成为了众多学习者刷题备考的得力工具。今天&#xff0c;我们就来深入剖析一个微信小程序刷题功能的实现逻辑&#xff0c;从代码层面揭开其神秘面纱。 小程序界面布局…

JVM--垃圾回收

垃圾回收的概念 垃圾回收主要针对的是堆中的对象&#xff0c;堆是一个共享的区域&#xff0c;创建的对象和数组都放在这个位置。但是我们不能一直的创建对象&#xff0c;也不是所有的对象能一直存放&#xff0c;如果不进行垃圾回收&#xff0c;内存迟早会耗尽&#xff0c;及时…

【教程】继承中的访问控制 C++

目录 简介public&#xff0c;protected 和 private继承中的 public&#xff0c;protected 和 private示例 简介 在 C 中派生类可以通过 public&#xff0c;protected 和 private 三种修饰符决定基类成员在派生类中的访问级别 public&#xff0c;protected 和 private 公有成…

【2025】基于python+django的驾校招生培训管理系统(源码、万字文档、图文修改、调试答疑)

课题功能结构图如下&#xff1a; 驾校招生培训管理系统设计 一、课题背景 随着机动车保有量的不断增加&#xff0c;人们对驾驶技能的需求也日益增长。驾校作为驾驶培训的主要机构&#xff0c;面临着激烈的市场竞争和学员需求多样化等挑战。传统的驾校管理模式往往依赖于人工操作…

要登录的设备ip未知时的处理方法

目录 1 应用场景... 1 2 解决方法&#xff1a;... 1 2.1 wireshark设置... 1 2.2 获取网口mac地址&#xff0c;wireshark抓包前预过滤掉自身mac地址的影响。... 2 2.3 pc网口和设备对接... 3 2.3.1 情况1&#xff1a;... 3 2.3.2 情…

go 安装swagger

1、依赖安装&#xff1a; # 安装 swag 命令行工具 go install github.com/swaggo/swag/cmd/swaglatest# 安装 gin-swagger 和 swagger 文件的依赖 go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files 2、测试 cmd中输入&#xff1a; swag -v 如果…

网络安全反渗透 网络安全攻防渗透

网络渗透防范主要从两个方面来进行防范&#xff0c;一方面是从思想意识上进行防范&#xff0c;另一方面就是从技术方面来进行防范。 1.从思想意识上防范渗透 网络攻击与网络安全防御是正反两个方面&#xff0c;纵观容易出现网络安全事故或者事件的公司和个人&#xff0c;在这些…

技术视界|构建理想仿真平台,加速机器人智能化落地

在近期的 OpenLoong 线下技术分享会 上&#xff0c;松应科技联合创始人张小波进行了精彩的演讲&#xff0c;深入探讨了仿真技术在机器人智能化发展中的关键作用。他结合行业趋势&#xff0c;剖析了现有仿真平台的挑战&#xff0c;并描绘了未来理想仿真系统的设计理念与实现路径…

环境配置 | 5分钟极简Git入门:从零上手版本控制

你是否刚接触Git&#xff1f;别担心&#xff01;这篇指南将用最简单的步骤带你掌握Git核心操作&#xff0c;快速开启版本控制之旅&#xff01;✨ 1.git在win10上的下载安装 1.1.下载git 打开官方网站 Git - Downloadshttps://git-scm.com/downloads ​ ​​ 1.2.git安装 …

计算机网络——DNS

一、什么是DNS&#xff1f; DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09; 是互联网的核心服务&#xff0c;负责将人类可读的域名&#xff08;如 www.baidu.com&#xff09;转换为机器可识别的 IP地址&#xff08;如 14.119.104.254&#xff09;。它像一…

SQLark 实战 | 如何从Excel、csv、txt等外部文件进行数据导入

数据导入导出是应用开发者在平时开发中最常用的操作之一&#xff0c;SQLark 里提供了方便的图形化界面来完成导入导出。本文先和大家分享如何从 Excel、csv、txt 等外部文件导入数据到数据库表中。 &#x1f449; 前往 SQLark 官网&#xff1a;www.sqlark.com 下载全功能免费版…

钉钉(excel)能让表格中不是‘北京’的字符串自动加亮显示(方便查看)以及隔行填充严颜色是斑马色(方便查看)嘛

在钉钉在线表格中&#xff0c;虽然功能相对Excel有所简化&#xff0c;但仍然可以通过条件格式实现对特定内容的高亮显示。以下是具体步骤&#xff1a; 一、在钉钉在线表格中设置条件格式 1. 打开钉钉在线表格 登录钉钉&#xff0c;进入“钉钉在线表格”应用。 打开你需要操作…

Windows根据文件名批量在文件夹里查找文件并复制出来,用WPF实现的详细步骤

项目前言 在日常工作和生活中&#xff0c;我们常常会遇到需要从大量文件中根据文件名批量查找特定文件并复制到指定位置的情况。手动一个个查找和复制文件不仅效率低下&#xff0c;还容易出错。使用 Windows Presentation Foundation (WPF) 可以创建一个用户友好的图形界面应用…

探索Maas平台与阿里 QWQ 技术:AI调参的魔法世界

摘要&#xff1a;本文介绍了蓝耘 Maas 平台在人工智能领域的表现及其核心优势&#xff0c;包括强大的模型支持、高效的资源调度和友好的操作界面。文章还探讨了蓝耘 Maas 平台与阿里 QWQ 技术的融合亮点及应用拓展实例&#xff0c;并提供了调参实战指南&#xff0c;最后对蓝耘 …