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

萧江网站建设做网站的自我介绍

萧江网站建设,做网站的自我介绍,响应式网站适合用什么框架做,网站二维码制作ViewBinding 参考资料: 新技术 ViewBinding 最佳实践 原理击穿 更多 ViewBinding 的封装思路 1. kotlin-android-extensions(KAE) 的问题 根据Google官方的说法, KAE存在以下问题: 污染全局命名空间不能暴露可空性信息仅支持Kotlin代码 kotlin在1.4.20中 开始废弃这…ViewBinding 参考资料: 新技术 ViewBinding 最佳实践 原理击穿 更多 ViewBinding 的封装思路 1. kotlin-android-extensions(KAE) 的问题 根据Google官方的说法, KAE存在以下问题: 污染全局命名空间不能暴露可空性信息仅支持Kotlin代码 kotlin在1.4.20中 开始废弃这个库了(https://blog.jetbrains.com/kotlin/2020/11/kotlin-1-4-20-released/#Deprecation_of_Kotlin_Android_Extensions) ReleaseNote中的原因是 KAT所填补的空白已经被ViewBinding所代替了, 所以他们不再支持了… 2. ViewBinding的使用 1. 开启ViewBinding 在model的build.gradle 中开启 android {viewBinding {enabled true} }之后每个xml布局都会生成对应ViewBinding类 如果想要忽略摸个布局文件, 可以添加tools:viewBindingIgnoretrue属性 LinearLayout...tools:viewBindingIgnoretrue .../LinearLayout2. 基本用法 生成的ViewBinding类使用以下方式的命名规则:将 XML 文件的名称转换为驼峰式大小写并在末尾添加“Binding”一词 例如, 有如下布局 名称为result_profile.xml: LinearLayout ... TextView android:idid/name /ImageView android:cropToPaddingtrue /Button android:idid/buttonandroid:backgrounddrawable/rounded_button / /LinearLayout所生成的绑定类的名称就为 ResultProfileBinding。此类具有两个字段一个是名为 name 的 TextView另一个是名为 button 的 Button。该布局中的 ImageView 没有 ID因此绑定类中不存在对它的引用。 每个绑定类还包含一个 getRoot() 方法用于为相应布局文件的根视图提供直接引用。在此示例中ResultProfileBinding 类中的 getRoot() 方法会返回 LinearLayout 根视图。 每一个Binding类都提供了3中创建ViewBinding对象的方式, 可以根据情况选择: 位置: ViewBinding的用法基本上都是在围绕着上面的3个方法 2.1 在Activity中只用 调用生成的绑定类中包含的静态 inflate() 方法。此操作会创建该绑定类的实例以供 Activity 使用。通过调用 getRoot() 方法或使用 Kotlin 属性语法获取对根视图的引用。将根视图传递到 setContentView()使其成为屏幕上的活动视图。 private lateinit var binding: ResultProfileBindingoverride fun onCreate(savedInstanceState: Bundle) {super.onCreate(savedInstanceState)binding ResultProfileBinding.inflate(layoutInflater)val view binding.rootsetContentView(view)}然后就可以使用对应的View了 binding.name.text viewModel.namebinding.button.setOnClickListener { viewModel.userClicked() }2.2 在Fragment中使用 调用生成的绑定类中包含的静态 inflate() 方法。此操作会创建该绑定类的实例以供 Fragment 使用。通过调用 getRoot() 方法或使用 Kotlin 属性语法获取对根视图的引用。从 onCreateView() 方法返回根视图使其成为屏幕上的活动视图。 private var _binding: ResultProfileBinding? null// This property is only valid between onCreateView and// onDestroyView.private val binding get() _binding!!override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {_binding ResultProfileBinding.inflate(inflater, container, false)val view binding.rootreturn view}override fun onDestroyView() {super.onDestroyView()_binding null} 2.3 在Adapter中使用ViewBinding 在Adapter中使用ViewBinding与之前没有什么不同 class SimpleDataAdapter : RecyclerView.AdapterSimpleDataAdapter.ViewHolder() {var dataList: ListData emptyList()set(value) {field valuenotifyDataSetChanged()}inner class ViewHolder(binding: ItemDataBinding) : RecyclerView.ViewHolder(binding.root) {val dataIv binding.dataIvval dataTv binding.dataTv}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {val binding ItemDataBinding.inflate(LayoutInflater.from(parent.context), parent, false)return ViewHolder(binding)}override fun onBindViewHolder(holder: ViewHolder, position: Int) {dataList[position].let {holder.dataIv.setImageResource(it.img)holder.dataTv.text it.txt}}override fun getItemCount(): Int dataList.size }2.4 对引入布局使用ViewBinding 2.4.1 include 比如有如下布局: titlebar.xml 希望作为一个通用布局引入到其他布局中 ?xml version1.0 encodingutf-8? RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parent Buttonandroid:idid/backandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_alignParentLefttrueandroid:layout_centerVerticaltrueandroid:textBack /TextViewandroid:idid/titleandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_centerInParenttrueandroid:textTitleandroid:textSize20sp /Buttonandroid:idid/doneandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_alignParentRighttrueandroid:layout_centerVerticaltrueandroid:textDone //RelativeLayoutactivity的布局: ?xml version1.0 encodingutf-8? LinearLayout xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:orientationverticalincludeandroid:idid/titleBarlayoutlayout/titlebar / /LinearLayoutActivity中使用 class IncludeActivity : AppCompatActivity() {private lateinit var binding: ActivityIncludeBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding ActivityIncludeBinding.inflate(layoutInflater)setContentView(binding.root)binding.titleBar.title.text Titlebinding.titleBar.back.setOnClickListener {}binding.titleBar.done.setOnClickListener {}}}这里可以看到 binding中根据id生成了一个titleBar的对象, 查看ViewBinding生成的代码可知, 这个titleBar还是一个ViewBinding的类: 2.4.2 merge 如果被引入的布局根标签是merge, 则不能使用上述方式了, 疑问merge会将被引入的布局直接合并到对应的位置, 所以在ViewBinding中, 通过id找对应的ViewBinding的过程中会失败 相较于2.4.1的代码: 删除include标签上的id属性在kotlin代码中, 自己赋值ViewBinding对象: class MergeActivity : AppCompatActivity() {private lateinit var binding: ActivityMergeBindingprivate lateinit var titlebarBinding: TitlebarMergeBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding ActivityMergeBinding.inflate(layoutInflater)setContentView(binding.root)titlebarBinding TitlebarMergeBinding.bind(binding.root)titlebarBinding.title.text TitletitlebarBinding.back.setOnClickListener {}titlebarBinding.done.setOnClickListener {}}}3. 封装 封装的主要思路是尽量不写,或少写一些模板代码, 主要的思路就是在创建ViewBinding对象上实现自动创建 3.1 Activity open class BaseReflectionAtyVB : ViewBinding : AppCompatActivity() {protected lateinit var binding: VBprivate setoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)generateViewBinding()if (this::binding.isInitialized) {setContentView(binding.root)binding.initViews()}}open fun VB.initViews() {}/*** 生成ViewBinding*/private fun generateViewBinding() {val type this::class.java.genericSuperclass as? ParameterizedType ?: returnval vbClazz type.actualTypeArguments.find {// 找到泛型声明为 实现了 ViewBinding接口的类型(it as Class*).genericInterfaces[0] ViewBinding::class.java} as? Class* ?: returnval method vbClazz.getMethod(inflate, LayoutInflater::class.java)binding method.invoke(null, layoutInflater) as VB} }在onCreate时, 通过generateViewBinding方法来生成对应的ViewBinding对象,使用时: class MainActivity : BaseReflectionAtyActivityMainBinding() {override fun ActivityMainBinding.initViews() {mainTextView.setOnClickListener {Toast.makeText(thisMainActivity, lalala, Toast.LENGTH_SHORT).show()}} }直接在initViews中使用布局文件中东的View即可 3.2 Fragment Fragment的思路与Activity相同 class BaseReflectionFragmentVB : ViewBinding : Fragment() {private var _binding: VB? nullprotected val binding: VBget() _binding!!override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {generateViewBinding(container)if (_binding ! null) {return binding.root}return super.onCreateView(inflater, container, savedInstanceState)}open fun VB.initViews() {}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)_binding?.initViews()}override fun onDestroyView() {super.onDestroyView()_binding null}/*** 生成ViewBinding*/private fun generateViewBinding(rootView: ViewGroup?) {val type this::class.java.genericSuperclass as? ParameterizedType ?: returnval vbClazz type.actualTypeArguments.find {// 找到泛型声明为 实现了 ViewBinding接口的类型(it as Class*).genericInterfaces[0] ViewBinding::class.java} as? Class* ?: returnval method vbClazz.getMethod(inflate,LayoutInflater::class.java,ViewGroup::class.java,Boolean::class.java)_binding method.invoke(null, layoutInflater, rootView, false) as VB} }3.3 Adapter ViewHolder: class BaseViewHolderVB : ViewBinding(val binding: VB) : RecyclerView.ViewHolder(binding.root)Adapter: abstract class ViewBindingAdapterVB : ViewBinding : RecyclerView.AdapterBaseViewHolderVB() {override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolderVB {generateViewBinding(parent)?.let {return BaseViewHolder(it)} ?: TODO(Not yet implemented)}private fun generateViewBinding(parent: ViewGroup): VB? {val type this::class.java.genericSuperclass as? ParameterizedType ?: return nullval vbClazz type.actualTypeArguments.find {// 找到泛型声明为 实现了 ViewBinding接口的类型(it as Class*).genericInterfaces[0] ViewBinding::class.java} as? Class* ?: return nullval layoutInflater LayoutInflater.from(parent.context)val method vbClazz.getMethod(inflate,LayoutInflater::class.java,ViewGroup::class.java,Boolean::class.java)return method.invoke(null, layoutInflater, parent, false) as VB} }
http://www.w-s-a.com/news/163613/

相关文章:

  • 昆明做网站seo的网站制作专业
  • 聊城制作手机网站公司wordpress 头条
  • 商城微网站模板一般电商网站做集群
  • winserver2008上用iis发布网站嵊州网站制作
  • 网站内页权重怎么查辽宁建设工程信息网怎么上传业绩
  • 丰都网站建设价格镇江网站制作费用
  • app手机网站建设黄网站建设定制开发服务
  • 百度网盘app下载徐州优化网站建设
  • 附近网站电脑培训班展台设计方案介绍
  • 河南便宜网站建设价格低上海高端室内设计
  • 保险网站有哪些平台wordpress会员vip购买扩展
  • 网站怎么做图片转换广州车陂网站建设公司
  • 下载flash网站网站设计书的结构
  • 水利建设公共服务平台网站放心网络营销定制
  • 设计网站过程wordpress+分页静态
  • 临海网站制作好了如何上线如果安装wordpress
  • 长沙 学校网站建设网站制作价格上海
  • 九江网站推广徽hyhyk1国家住房部和城乡建设部 网站首页
  • 阿克苏网站建设咨询动漫设计与制作属于什么大类
  • 网站编辑做多久可以升职wordpress版权修改
  • 网站开发维护成本计算国外外贸平台
  • 简单的招聘网站怎么做购物网站功能报价
  • 哪个网站做中高端衣服建设自己网站的流程
  • 网站建设概况做网站的是怎么赚钱的
  • 网站发布信息的基本流程现在都不用dw做网站了吗
  • 赣州热门网站深圳龙岗做网站的公司
  • 中国最大的建站平台广告传媒公司取名
  • 深圳网站设计公司专业吗学动漫设计后悔死了
  • 企业网站形象建设网站开发入职转正申请书
  • 网站设计步骤济南建设网中标公告