正如我们在此处阅读的那样,ViewBinding和之间的差异非常小Databinding。
数据绑定库只处理使用
<layout>标签创建的数据绑定布局。视图绑定不支持布局变量或布局表达式,因此它不能用于将布局与 XML 中的数据绑定。
开发人员是否应该注意其他任何差异?为什么要创造出如此微小差异的新东西?
有人请解释
我对这个“新”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 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) 最近我从 ButterKnife 转向 Android View Binding。我的所有布局都运行良好,但是迁移到 View Binding 后,出现了一个奇怪的行为,所有 RecyclerView 项目都有 aslayout_width而wrap_content不是match_parent。
当我查看布局检查器工具时,我发现卡片视图wrap_content的宽度有价值。
但是,我没有更改 xml 文件,因此宽度实际上仍然是match_parent。
我错过了什么吗?
我使用的是 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) 当我在 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 应用程序中使用,我基本上是为&viewbinding创建基类,以删除每次编写膨胀代码的样板。ActivityFragment
活动:
BaseActivity和viewbinding:
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) ComposeView我在 XML 布局文件中添加了一个。我使用视图绑定在我的活动中膨胀此文件。当我尝试调用时binding.myComposeView.setContent { ... },出现以下编译错误:Unresolved reference: setContent。当我查看生成的绑定文件时,可以看到myComposeViewisView和 not的类型ComposeView。当我使用findViewById<ComposeView>(R.id.myComposeView).setContent { ... }时一切正常。为什么绑定没有正确生成?我可以做什么来使用带有 a 的视图绑定ComposeView?
我经历过这个并找到了一个共同的答案,即
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
目的是声明一个基类
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 知识范围
这真的可以做到吗?
android ×9
kotlin ×2
android-mvvm ×1
android-xml ×1
generics ×1
radio-button ×1
radio-group ×1