标签: android-viewbinding

为什么要使用 ViewBinding 而不是 DataBinding?

正如我们在此处阅读的那样,ViewBinding和之间的差异非常小Databinding

  • 数据绑定库只处理使用<layout>标签创建的数据绑定布局。

  • 视图绑定不支持布局变量或布局表达式,因此它不能用于将布局与 XML 中的数据绑定。

开发人员是否应该注意其他任何差异?为什么要创造出如此微小差异的新东西?

有人请解释

android android-databinding android-viewbinding

2
推荐指数
1
解决办法
2114
查看次数

Android &lt;include&gt; 不适用于 ViewBinding

我对这个“新”Android 视图绑定有疑问。<include> 当我尝试在 XML 布局文件中 使用 a 时,出现异常 :<include layout="@layout/teaser_agreement" />

包含文件只是一个基本的布局文件。<include>如果我直接用应该包含的布局代码替换标签,一切都会正常。

这是生成的类的异常:

error: incompatible types: TeaserAgreementBinding cannot be converted to ViewDataBinding
        setContainedBinding(this.mboundView11);
Run Code Online (Sandbox Code Playgroud)

有什么建议么?

谢谢,米尔科

android android-viewbinding

2
推荐指数
1
解决办法
1310
查看次数

查看 &lt;Ininclude&gt; 布局的绑定问题

我正在使用 Android Studio 3.6.2 并启用了视图绑定功能。

在通过绑定使用包含标签添加视图时遇到困难。

工具栏.xml

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.appbar.MaterialToolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    style="?toolbarStyle"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:elevation="0dp" />
Run Code Online (Sandbox Code Playgroud)

MainActivity.xml

<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)

<include
    android:id="@+id/toolbar"
    layout="@layout/toolbar"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<androidx.fragment.app.FragmentContainerView
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:defaultNavHost="true"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/toolbar"
    app:navGraph="@navigation/merchant_navigation_graph" />
Run Code Online (Sandbox Code Playgroud)

MainActivity.kt

    class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        setTheme(R.style.AvailsTheme_DayNight)
        super.onCreate(savedInstanceState)
        val binding = ActivityMainBinding.inflate(layoutInflater)

        val toolbarBinding = binding.toolbar

        setContentView(binding.root)
    }
}
Run Code Online (Sandbox Code Playgroud)

android android-jetpack android-viewbinding

2
推荐指数
1
解决办法
6553
查看次数

迁移到视图绑定后,RecyclerView 项目宽度变为wrap_content

最近我从 ButterKnife 转向 Android View Binding。我的所有布局都运行良好,但是迁移到 View Binding 后,出现了一个奇怪的行为,所有 RecyclerView 项目都有 aslayout_widthwrap_content不是match_parent

在此输入图像描述

当我查看布局检查器工具时,我发现卡片视图wrap_content的宽度有价值。

在此输入图像描述

但是,我没有更改 xml 文件,因此宽度实际上仍然是match_parent

在此输入图像描述

我错过了什么吗?

android android-xml android-viewbinding

2
推荐指数
1
解决办法
524
查看次数

当我在 Android Studio 的 gradle 中添加 viewBinding 时,出现错误

我使用的是 Android Studio 4.0.1 版。

当我添加 viewBinding 时,出现错误。

在 gradle 中添加 viewBinding 时出错。

buildFeatures {
    viewBinding = true
}
Run Code Online (Sandbox Code Playgroud)

build.gradle 文件

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    buildToolsVersion "28.0.3"

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 5
        versionName "1.2.0"
        resValue("string", "growingio_project_id", "8979dc98cc52320f")
        resValue("string", "growingio_url_scheme", "growing.1f3e3791e1d6aee5")
    }
    compileOptions {
        sourceCompatibility rootProject.ext.sourceCompatibilityVersion
        targetCompatibility rootProject.ext.targetCompatibilityVersion
    }

    buildFeatures {
        viewBinding = true
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: "*.jar")
    implementation …
Run Code Online (Sandbox Code Playgroud)

android android-gradle-plugin android-viewbinding

2
推荐指数
1
解决办法
900
查看次数

ViewBinding.getRoot().getLayoutParams() 始终返回 null

当我在 RecyclerView.Adapter 中使用 ViewBinding 时,如下所示:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    val layoutInflater = LayoutInflater.from(parent.context)
    val itemView1 = MyItemBinding.inflate(layoutInflater).root
    val itemView2 = layoutInflater.inflate(R.layout.my_item, parent, false)
    val itemView3 = MyItemBinding.bind(itemView2).root
    return ViewHolder(itemView1)
}
Run Code Online (Sandbox Code Playgroud)

itemView1layoutParams始终为null——忽略xml中的attrs,并且itemView2&itemView3的layoutParams正常工作。那么这是 ViewBinding::inflate 的错误吗?

android android-jetpack android-viewbinding

2
推荐指数
1
解决办法
915
查看次数

带有视图绑定的 BaseFragment

为了在 Android 应用程序中使用,我基本上是为&viewbinding创建基类,以删除每次编写膨胀代码的样板。ActivityFragment

活动:

BaseActivityviewbinding

abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = getViewBinding()
    }

    abstract fun getViewBinding(): VB

}
Run Code Online (Sandbox Code Playgroud)

MainActivity:

class MainActivity : BaseActivity<ActivityMainBinding>() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)
        //we can directly use binding now and it works fine inside activity
        //binding.view.doSomething() 
    }

 override fun getViewBinding(): ActivityMainBinding = ActivityMainBinding.inflate(layoutInflater)
}
Run Code Online (Sandbox Code Playgroud)

片段

BaseFragment:

abstract class BaseFragment<VB : ViewBinding> : …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-mvvm android-viewbinding

2
推荐指数
1
解决办法
5366
查看次数

具有视图绑定的 ComposeView

ComposeView我在 XML 布局文件中添加了一个。我使用视图绑定在我的活动中膨胀此文件。当我尝试调用时binding.myComposeView.setContent { ... },出现以下编译错误:Unresolved reference: setContent。当我查看生成的绑定文件时,可以看到myComposeViewisView和 not的类型ComposeView。当我使用findViewById<ComposeView>(R.id.myComposeView).setContent { ... }时一切正常。为什么绑定没有正确生成?我可以做什么来使用带有 a 的视图绑定ComposeView

android-jetpack-compose android-viewbinding

2
推荐指数
1
解决办法
4652
查看次数

如何使用视图绑定从单选组中获取选中的 id 文本?

我经历过这个并找到了一个共同的答案,即

        int selectedId = radioGroup.getCheckedRadioButtonId();

        radioButton = (RadioButton) findViewById(selectedId);

        Toast.makeText(MyAndroidAppActivity.this,
            radioButton.getText(), Toast.LENGTH_SHORT).show();
Run Code Online (Sandbox Code Playgroud)

但是如何使用视图绑定获取文本呢?

android radio-group radio-button android-studio android-viewbinding

2
推荐指数
1
解决办法
1718
查看次数

Kotlin 在父级中膨胀通用视图绑定类

目的是声明一个基类

abstract class BaseDialog<T : ViewBinding> : AppCompatDialogFragment() {
       lateinit var binding: T
}
Run Code Online (Sandbox Code Playgroud)

并且所有子类都应该扩展这个父类

class ChildClass: BaseDialog<ChildClassViewBinding>() {
}

Run Code Online (Sandbox Code Playgroud)

然后我想膨胀父类中的绑定并将其保存到绑定属性这似乎超出了我的 kotlin 知识范围

这真的可以做到吗?

generics android kotlin android-viewbinding

2
推荐指数
1
解决办法
3338
查看次数