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 = 0nice. 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中的视图绑定一起使用
发布评论