Android ViewBinding 无法渲染 LinearLayout 配置

3

ViewBinding实现无法呈现我代码中使用的LinearLayout的布局配置,而旧的findViewById()技术可以使用相同的布局。

我已经设置gradle来使用ViewBinding。

android {
    ...
    buildFeatures {
        viewBinding = true
}

以下是使用LinearLayout的活动。 activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:orientation="vertical"
    tools:context=".MainActivity">

  <ImageView
        ... />

  <Button
        ... />

</LinearLayout>

对应的 Kotlin 类包括绑定实例,将其根视图传递给 setContentView()

MainActivity.kt

private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    ...

    setContentView(binding.root)
}

虽然布局编辑器可以正确地呈现应用程序的对齐方式,但一旦将其启动到模拟器上,使用LinearLayout的layout_gravity设置的center_vertical对齐方式等布局配置将被忽略。

ViewBinding的实现有什么问题或遗漏吗?


我更新了我的答案。 - undefined
我在使用我的RecyclerView时遇到了相同的问题。你解决了这个问题吗? - undefined
4个回答

2

我在“使用Kotlin开发Android应用程序”课程中做练习时遇到了同样的问题。

我没有找到解决方案,因为我认为如果不使用视图绑定,则必须将主_activity.xml中的一个视图作为根视图(可能是相同的全屏),因此在没有视图绑定的情况下使用layout_gravity可以正常工作,因为它将LinearLayout相对于屏幕定位。但是,当使用视图绑定时,我认为它将LinearLayout作为其根视图,因此layout_gravity无效(再次说明,我不确定,我不太了解视图绑定的工作原理)。

我使用的解决方案是尝试使用不同的方式实现相同的视图。为此,在activity_main.xml中我使用了:

android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical"
tools:context=".MainActivity">

我无法解释为什么这对我起作用了,但它确实起作用了。也许是因为android:gravity="center_vertical"android:layout_gravity="center_vertical"之间的区别。 - undefined

2
在你的activity_main.xml文件中,给你的LinearLayout添加一个id

2

遇到同样的问题,通过在activity_main.xml中的LinearLayout添加 android:gravity="center_vertical" 解决。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:layout_gravity="center_vertical"
    android:orientation="vertical"
    android:id="@+id/root_view"
    tools:context=".MainActivity">

</LinearLayout>

1
可能的一个原因是你的LinearLayout没有任何id
当你执行binding.root时,它会保留根视图的引用,这在你的情况下是LinearLayout。
根据官方文档:
如果为模块启用了视图绑定,则为该模块包含的每个XML布局文件生成一个绑定类。每个绑定类都包含对根视图和具有ID的所有视图的引用。
给你的LinearLayout添加id:android:id="rootView",重新构建项目并尝试运行。我希望这可以解决你的问题。
谢谢 & 祝编码愉快..!

我正在使用Android Studio 4.0进行工作。你提供的配置适用于Android Studio 3.6。这篇Android开发者的博客文章指出最新版本中的build.gradle配置已经发生了变化。 - undefined
糟糕,我的错。谢谢你告诉我这个问题。 - undefined
刚刚试过了,还是没有成功。为了提供更多细节,我能够使用绑定类实例来操作ViewGroup中的视图,就像binding.myButton.setOnClickListener { ... }这样。唯一存在的问题是ViewGroup布局属性的渲染。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接