当前位置: 首页 > 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.hkea.cn/news/14438634/

相关文章:

  • 网站被百度删除的原因国外网站网站app
  • 网站与网页的关系网站建设员性质
  • 网站空间到期时间查询淮安网站建设要多少钱
  • 网站备案备的是域名还是空间然后制作网页
  • seo网站推广专员招聘品牌建设 奖
  • 购物网站建设与开发wordpress电影下载站
  • 网站开发工作室创新的沈阳网站建设
  • 搞笑视频素材网站免费北京做网站的价格
  • 网站维护需要会什么高端网站建设公司怎么选
  • 看电视剧的免费网站大全郑州做网站要
  • 网站设计与建设考试做算命类网站违法吗?
  • 沧州网站建设的集成商comsenzexp wordpress
  • 不备案的网站可以做竞价吗深圳专业做网页的公司
  • 免费p2p网站建设论坛推广的步骤
  • 黄埔网站建设(信科网络)用vs2008做网站教程
  • 网站怎么制作的90后做网站月入万元
  • 建设银行网站电脑上不去sqlite3做网站数据库
  • 免费收录网站推广有没有帮人做机械设计的网站
  • 网站架构是什么岳阳网
  • 跨境电商网站建设主管岗位职责手机网站开发 html
  • 教程推广优化网站排名在手机上自建网站怎么弄
  • dw做网站表格插不到右边网站建设微信商城网站制作
  • 狗铺子做网页在那个网站wordpress 随机显示
  • 建设电子商务网站古风头像在线制作免费
  • 网站建设用的什么语言柳州住房和城乡建设局网站
  • 网站建设公司的政策风险做网站容易还是app
  • 六安市公司网站建设如何利用路由建设网站
  • 手机模板网站模板下载网站有哪些内容做 爱 网站视频短片
  • 营销网站主题有哪些电商网站多少钱
  • o2o网站建设方案淘宝上网站开发退款