gpt4 book ai didi

android - Kotlin 中的数据绑定(bind)无法与 View 绑定(bind)一起使用

转载 作者:行者123 更新时间:2023-12-02 11:01:52 25 4
gpt4 key购买 nike

Android Studio 3.6

构建.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"

在app/build.gradle中:

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

在我的 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)
}
})
}

我的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"/>

启动应用程序后,成功滑动viewpager2。结果成功显示下一条消息:

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

不错。但qrBottonMainContainer没有隐藏。为什么?

附注如果我删除这个:

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

然后就成功了。

为什么?

最佳答案

您不能在同一布局中同时使用它们。

ViewBindingDataBinding 的子集如果您想替换像 ButterKnife 这样的库,则可以并且应该使用, KotterKnife或 KAE(Kotlin Android 扩展),但不想投资数据绑定(bind)重构。

如果您使用DataBinding您已经在 binding 中拥有组成布局的 View 的 id 引用目的。类似 binding.myTextView .

请记住:

  • 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.

根据文档here

PS:在您的具体情况下,您不能使用 <layout>标签为 ViewBinding

关于android - Kotlin 中的数据绑定(bind)无法与 View 绑定(bind)一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58557650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com