数据绑定不能与Kotlin中的视图绑定一起使用

编程入门 行业动态 更新时间:2024-10-26 13:28:52
本文介绍了数据绑定不能与Kotlin中的视图绑定一起使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

Android Studio 3.6

build.gradle:

buildscript {ext.kotlin_version ='1.3.50'储存库{谷歌()jcenter()}依赖项{classpath'com.android.tools.build:gradle:3.6.0-beta01'类路径"org.jetbrains.kotlin:kotlin-gradle-plugin:$ kotlin_version"

在app/build.gradle中:

android {viewBinding.enabled = truedataBinding {启用=真}

在我的活动中:

导入android.os.Bundle导入android.util.Log导入androidx.appcompat.app.AppCompatActivity导入androidx.viewpager2.widget.ViewPager2导入com.myproject.BuildConfig导入com.myproject.R导入com.myproject.adapter.CustomFragmentStateAdapter导入com.myproject.databinding.QrBluetoothSwipeActivityBinding导入com.myproject.ui.fragment.BluetoothPageFragment导入com.myproject.ui.fragment.QrPageFragment导入androidx.databinding.DataBindingUtil导入androidx.databinding.ObservableInt类QRBluetoothSwipeActivity:AppCompatActivity(){私人lateinit var viewBinding:QrBluetoothSwipeActivityBindingvar positionObservable = ObservableInt()伴随对象{私有val TAG = QRBluetoothSwipeActivity :: class.java.name}重写fun onCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)//数据绑定初始化val binding = DataBindingUtil.setContentView< QrBluetoothSwipeActivityBinding>(R.layout.qr_bluetooth_swipe_activity)binding.setHandler(this)//viewbinding初始化viewBinding = QrBluetoothSwipeActivityBinding.inflate(layoutInflater)setContentView(viewBinding.root)在里面()}私人娱乐init(){val customFragmentStateAdapter = CustomFragmentStateAdapter(this)customFragmentStateAdapter.addFragment(QrPageFragment())customFragmentStateAdapter.addFragment(BluetoothPageFragment())viewBinding.viewPager2.adapter = customFragmentStateAdapterviewBinding.viewPager2.registerOnPageChangeCallback(object:ViewPager2.OnPageChangeCallback(){重写fun onPageSelected(position:Int){如果(BuildConfig.DEBUG){Log.d(TAG,"registerOnPageChangeCallback:position = $ position")}positionObservable.set(position)}})}

我的 qr_bluetooth_swipe_activity.xml

<?xml version ="1.0" encoding ="utf-8"?>< layout xmlns:android ="schemas.android/apk/res/android"xmlns:app ="schemas.android/apk/res-auto"><数据>< import type ="android.view.View"/><变量name ="handler"type ="com.myproject.actviity.QRBluetoothSwipeActivity"/></data>< androidx.constraintlayout.widget.ConstraintLayoutandroid:layout_width ="match_parent"android:layout_height ="match_parent">< androidx.viewpager2.widget.ViewPager2android:id ="@ + id/viewPager2"android:layout_width ="0dp"android:layout_height ="0dp"app:layout_constraintBottom_toTopOf ="@ + id/bottonContainer"app:layout_constraintEnd_toEndOf ="parent"app:layout_constraintStart_toStartOf ="parent"app:layout_constraintTop_toTopOf ="parent"/>< androidx.constraintlayout.widget.ConstraintLayoutandroid:id ="@ + id/bottonContainer"android:layout_width ="0dp"android:layout_height ="104dp"app:layout_constraintBottom_toBottomOf ="parent"app:layout_constraintEnd_toEndOf ="parent"app:layout_constraintStart_toStartOf ="parent">< androidx.constraintlayout.widget.ConstraintLayoutandroid:id ="@ + id/qrBottonMainContainer"android:layout_width ="0dp"android:layout_height ="104dp"android:visibility ="@ {handler.positionObservable == 0?View.GONE:View.VISIBLE}"app:layout_constraintBottom_toBottomOf ="parent"app:layout_constraintEnd_toEndOf ="parent"app:layout_constraintStart_toStartOf ="parent"/>

启动应用后,然后成功滑动 viewpager2 .结果成功显示了下一条消息:

10-25 14:25:24.991 D/com.myproject.actviity.QRBluetoothSwipeActivity(23012):registerOnPageChangeCallback:position = 0

好.但是 qrBottonMainContainer 不能隐藏.为什么?

P.S.如果我删除了此内容:

viewBinding = QrBluetoothSwipeActivityBinding.inflate(layoutInflater)setContentView(viewBinding.root)

然后成功工作.

为什么?

解决方案

您不能在相同的布局中使用它们.

ViewBinding 是 DataBinding 的功能的子集,如果要替换 ButterKnife , KotterKnife之类的库,应使用

ViewBinding 或KAE(Kotlin Android扩展),但不想投资于数据绑定重构.

如果使用 DataBinding ,则已经在 binding 对象中拥有构成布局的视图的ID参考.类似于 binding.myTextView .

请记住:

  • 数据绑定库仅处理使用< layout> 标记创建的数据绑定布局.
  • 视图绑定不支持布局变量或布局表达式,因此不能用于将布局与XML数据绑定.

根据文档此处

PS:在您的特定情况下,您不能将< layout> 标记与 ViewBinding

一起使用

Android Studio 3.6

build.gradle:

buildscript { ext.kotlin_version = '1.3.50' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.6.0-beta01' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

in app/build.gradle:

android { viewBinding.enabled = true dataBinding { enabled = true }

in my activity:

import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.viewpager2.widget.ViewPager2 import com.myproject.BuildConfig import com.myproject.R import com.myproject.adapter.CustomFragmentStateAdapter import com.myproject.databinding.QrBluetoothSwipeActivityBinding import com.myproject.ui.fragment.BluetoothPageFragment import com.myproject.ui.fragment.QrPageFragment import androidx.databinding.DataBindingUtil import androidx.databinding.ObservableInt class QRBluetoothSwipeActivity : AppCompatActivity() { private lateinit var viewBinding: QrBluetoothSwipeActivityBinding var positionObservable = ObservableInt() companion object { private val TAG = QRBluetoothSwipeActivity::class.java.name } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // databinding init val binding = DataBindingUtil.setContentView<QrBluetoothSwipeActivityBinding>( this, R.layout.qr_bluetooth_swipe_activity ) binding.setHandler(this) // viewbinding init viewBinding = QrBluetoothSwipeActivityBinding.inflate(layoutInflater) setContentView(viewBinding.root) init() } private fun init() { val customFragmentStateAdapter = CustomFragmentStateAdapter(this) customFragmentStateAdapter.addFragment(QrPageFragment()) customFragmentStateAdapter.addFragment(BluetoothPageFragment()) viewBinding.viewPager2.adapter = customFragmentStateAdapter viewBinding.viewPager2.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { if (BuildConfig.DEBUG) { Log.d(TAG, "registerOnPageChangeCallback: position = $position") } positionObservable.set(position) } }) }

my qr_bluetooth_swipe_activity.xml

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="schemas.android/apk/res/android" xmlns:app="schemas.android/apk/res-auto"> <data> <import type="android.view.View" /> <variable name="handler" type="com.myproject.actviity.QRBluetoothSwipeActivity" /> </data> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.viewpager2.widget.ViewPager2 android:id="@+id/viewPager2" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toTopOf="@+id/bottonContainer" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/bottonContainer" android:layout_width="0dp" android:layout_height="104dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/qrBottonMainContainer" android:layout_width="0dp" android:layout_height="104dp" android:visibility="@{handler.positionObservable == 0 ? View.GONE: View.VISIBLE}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"/>

After start app then success swipe viewpager2. And as result success show the next message:

10-25 14:25:24.991 D/com.myproject.actviity.QRBluetoothSwipeActivity(23012): registerOnPageChangeCallback: position = 0

nice. But qrBottonMainContainer not hide. Why?

P.S. If I remove this:

viewBinding = QrBluetoothSwipeActivityBinding.inflate(layoutInflater) setContentView(viewBinding.root)

then success work.

why?

解决方案

You can't use them togheter in the same layout.

ViewBinding is a subset of what DataBinding can do and should be used if you want to replace libraries like ButterKnife, KotterKnife or KAE (Kotlin Android Extensions) but don't want to invest in databinding refactoring.

If you use DataBinding you already have the id reference of the views composing the layout in your binding object. Something like binding.myTextView.

Remember that:

  • The data binding library only processes data binding layouts created using the <layout> tag.
  • View binding doesn't support layout variables or layout expressions, so it can't be used to bind layouts with data in XML.

As per the documentation here

PS: In your specific case you can't use <layout> tags with ViewBinding

更多推荐

数据绑定不能与Kotlin中的视图绑定一起使用

本文发布于:2023-10-30 18:53:42,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1543707.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:绑定   视图   能与   数据   Kotlin

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!