数据绑定不能与Kotlin中的视图绑定一起使用 [英] Databinding not work together with viewbinding in 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 ="http://schemas.android.com/apk/res/android"xmlns:app ="http://schemas.android.com/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)
然后成功工作.
为什么?
您不能在相同的布局中使用它们.
如果使用 请记住: 根据文档此处 PS:在您的特定情况下,您不能将 Android Studio 3.6 build.gradle: in app/build.gradle: in my activity: my qr_bluetooth_swipe_activity.xml After start app then success swipe viewpager2.
And as result success show the next message: nice.
But P.S. If I remove this: then success work. why? You can't use them togheter in the same layout. If you use Remember that: As per the documentation here PS: In your specific case you can't use 这篇关于数据绑定不能与Kotlin中的视图绑定一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋! ViewBinding
是 DataBinding
的功能的子集,如果要替换 ButterKnife
, KotterKnife之类的库,应使用
ViewBinding
或KAE(Kotlin Android扩展),但不想投资于数据绑定重构. DataBinding
,则已经在 binding
对象中拥有构成布局的视图的ID参考.类似于 binding.myTextView
.< layout>
标记创建的数据绑定布局.< layout>
标记与 ViewBinding
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"
android {
viewBinding.enabled = true
dataBinding {
enabled = true
}
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)
}
})
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/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"/>
10-25 14:25:24.991 D/com.myproject.actviity.QRBluetoothSwipeActivity(23012): registerOnPageChangeCallback: position = 0
qrBottonMainContainer
not hide. Why?viewBinding = QrBluetoothSwipeActivityBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
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.DataBinding
you already have the id reference of the views composing the layout in your binding
object. Something like binding.myTextView
.
<layout>
tag.<layout>
tags with ViewBinding