数据绑定不能与Kotlin中的视图绑定一起使用 [英] Databinding not work together with viewbinding in Kotlin

查看:59
本文介绍了数据绑定不能与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) 

然后成功工作.

为什么?

解决方案

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

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="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"/>

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中的视图绑定一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆