标签: android-viewbinding

无法访问viewBinding

我现在正在 Kotlin 中使用 viewBinding。

这是我的 build.gradle 构建.gradle

启用 ViewBinding 并具有自动导入 ViewBinding 依赖项。

但 Android Studio 仍然显示这样的错误 Android Studio 错误

但我可以毫无问题地构建和运行。

如果我在依赖项中添加 viewBinding,那么错误就会消失。

有谁知道为什么?

更新:

我知道为什么。我正在使用 AndroidX,IDE 说无法访问“android.viewbinding.ViewBinding”,但我的依赖项是 AndroidX,它是“androidx.viewbinding.ViewBinding”,包名称已更改。

解决方案:将 android.useAndroidX=true 添加到项目 gradle.properties 文件中。

全局 gradle.properties 设置不起作用,不知道为什么。

android kotlin android-studio android-viewbinding

4
推荐指数
2
解决办法
5187
查看次数

ViewBinding 未在自定义视图中显示视图

我正在尝试在添加到项目中的新模块中使用 ViewBinding,该模块将包含项目中的所有 CustomView。

目前,该模块是唯一实现视图绑定的模块。主模块(应用程序)使用 kotlin 合成。

最初我有这两个自定义视图:

Pre - ViewBinding --> 这是有效的。我可以在附加的片段中看到它)

自定义视图 1:

import kotlinx.android.synthetic.main.layout_horizontal_filter.view.*

class HorizontalFiltersView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {

    private val adapter: HorizontalFilterAdapter
    private val decoration: HorizontalFilterDecorator

    init {
        LayoutInflater.from(context).inflate(R.layout.layout_horizontal_filter, this, true)
        this.adapter = HorizontalFilterAdapter(context)
        this.decoration = HorizontalFilterDecorator(context, 16)

        recycler.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
        recycler.adapter = this.adapter
        recycler.addItemDecoration(this.decoration)
        recycler.setHasFixedSize(true)
    }

    fun setFilters(filtersList: MutableList<HorizontalFilter>) {
        this.adapter.refresh(filtersList)
    }

}
Run Code Online (Sandbox Code Playgroud)

自定义视图2:

import kotlinx.android.synthetic.main.item_horizontal_filter.view.*
class HorizontalFilterItem …
Run Code Online (Sandbox Code Playgroud)

android android-custom-view kotlin android-viewbinding

4
推荐指数
1
解决办法
3787
查看次数

Android 在 onCreate 活动之外访问视图绑定 val

我有一个带有按钮的活动。在按钮上单击“我想更新文本视图中的文本”。我想用ViewBinding普通的代替findViewById

这就是我创建 val 绑定的方式

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding = ActivityMainBinding.inflate(layoutInflater);
    setContentView(binding.root)

    binding.btnRoll.setOnClickListener {
        rollDice()
    }
}
Run Code Online (Sandbox Code Playgroud)

现在rollDice我想更新文本视图,但我无法访问有意义的绑定,因为它的范围仅限于onCreate(),那么对此的最佳实践是什么?

  private fun rollDice() {
       val random = Random().nextInt(6) + 1
       binding.txt_random.setText("random")
    }
Run Code Online (Sandbox Code Playgroud)

android kotlin android-viewbinding

4
推荐指数
1
解决办法
4879
查看次数

使用视图绑定时,如何处理不同布局配置中缺失的视图?

据我所知,任何带有 ID 的 XML 元素都应该通过视图绑定自动拉入活动类。但是,Android Studio 不断提示我的按钮可以为 null,并且需要具有?.!!.进行编译。

如果我用 断言不可为 null !!.,它实际上会导致按钮出现运行时 NullPointerException。

为什么视图绑定无法识别我的按钮的类型和存在?

我的主要活动代码在这里:

package com.stevenswang.ageinminutes

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.stevenswang.ageinminutes.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

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

        binding.btnSelectDate.setOnClickListener {...} //this line gives the compiler error in the title
    }
    
}
Run Code Online (Sandbox Code Playgroud)

此处应用程序的 XML(完整):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/backgroundColor"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:padding="16sp"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" …
Run Code Online (Sandbox Code Playgroud)

android android-button kotlin android-viewbinding

4
推荐指数
1
解决办法
977
查看次数

如何在android中使用kotlin合成从包含的布局访问视图

在我的片段布局中,我添加了一个包含 include 的布局

<?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"
xmlns:tools="http://schemas.android.com/tools">

<data>

  
</data>

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:itemCount="3"
        tools:listitem="@layout/list_item_eceived" />

    <include
        layout="@layout/item_user_input"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

我包含的布局

<?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"
xmlns:tools="http://schemas.android.com/tools">

<data>

    <variable
        name="hint"
        type="String" />
    <variable
        name="available"
        type="Boolean" />
</data>

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/message_box_parent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="12dp"
    android:elevation="2dp"
    android:minHeight="50dp"
    app:layout_goneMarginStart="6dp">

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/message_view"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="4dp"
        android:focusable="true"
        android:hint="@{hint}"
        android:maxHeight="128dp"
        android:padding="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/send_btn_view"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/send_btn_view"
        android:layout_width="44dp" …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-viewbinding

4
推荐指数
1
解决办法
2112
查看次数

ViewBinding 与 Java11,AndroidStudio 总是显示错误(但运行没有任何问题)

我注意到在 Java8 中,AndroidStudio (Arctic Fox) 中的 viewBinding 没有问题。

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
buildFeatures {
    viewBinding true
}
Run Code Online (Sandbox Code Playgroud)

但是,一旦我设置compileOptionsJavaVersion.VERSION_11,AndroidStudio 总是错误地显示 viewBiding(s) 错误,尽管它可以毫无问题地编译和运行。

我在 AndroidStudio ArcticFox 中使用一个全新的项目对此进行了测试。它建议导入类。导入后,显示未找到包

截图 1

截图 2

这是 AndroidStudio 的错误,还是我的 AndroidStudio 中的 Java 编译器设置有任何错误配置?

我所做的只是一些特别的事情JavaVersion.VERSION_11

java android android-studio android-viewbinding

4
推荐指数
1
解决办法
202
查看次数

如何在jetpack compose中导入AndroidViewBinding

我正在尝试在 jetpack compose 中使用一些片段,但无法从 (androidx.compose.ui.viewinterop) 导入 AndroidViewBinding,并且它始终显示为未解析的名称

怎么导入呢??

xml-layout android-jetpack-compose android-viewbinding composable

4
推荐指数
1
解决办法
4805
查看次数

使用视图绑定显示空白屏幕

我正在我的新应用中试验视图绑定。今天突然当我运行该应用程序时,它显示空白屏幕而不是 UI。如果我删除绑定并使用 setContentView,它会起作用!知道为什么会这样吗?

代码:build.gradle

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

主要活动

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
}
Run Code Online (Sandbox Code Playgroud)

android android-layout android-studio android-jetpack android-viewbinding

3
推荐指数
1
解决办法
435
查看次数

我可以在我的 Android 片段中消除视图模型和视图绑定样板代码吗?

我发现自己为我创建的每个新片段编写样板代码。这包括设置视图模型和视图绑定,这是我的代码的 2 个不同部分,它们不相互依赖,因此其中之一的解决方案仍然很棒。

片段代码示例:

class MyFragment : Fragment() {

    // View binding
    private var _binding: FragmentMyBinding? = null

    // View model
    private lateinit var model : MyViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Model init
        model = ViewModelProvider(this).get(MyViewModel::class.java)

        //binding init
        _binding = FragmentMyBinding.inflate(inflater, container, false)

        return _binding!!.root
    }

}

class MyViewModel : ViewModel()
Run Code Online (Sandbox Code Playgroud)

android boilerplate kotlin android-viewmodel android-viewbinding

3
推荐指数
1
解决办法
654
查看次数

为什么 id 被删除?

在我的 Android 项目中,我使用视图绑定:

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

理想情况下我只会使用dataBinding,但在这种情况下我总是需要使用标签

<layout ...> </layout>
Run Code Online (Sandbox Code Playgroud)

在 XML 布局中以使用它。这就是为什么我只在真正需要在 XML 中绑定数据的地方使用它。在其他情况下,我会使用viewBinding该插件,因为该插件'kotlin-android-extensions'已被弃用。一切正常,但是运行时出现以下问题Analyze -> Inspect code。完成后,会发现一些未使用的资源(在 下Android -> Lint -> Perfomance -> Unused resources),并且我会删除所有这些资源,因为我不需要它们,它还会删除为 XML 中的所有视图分配的 ID。但是,带有标签的 XML 中的 ID<layout ...> </layout>不会被删除。仅在使用时才会删除 ID viewBinding

我不是专家,但我认为删除未使用的资源与 s 的 ID 没有任何关系View,并且这种情况不应该发生。

每次优化之后(意味着清理未使用的资源中的项目),我总是必须分配 ID,这是非常低效的,特别是当项目变得更大并且有更多的ViewID 时。

为什么会发生这种情况以及如何防止这种情况发生?

android android-studio android-databinding android-viewbinding

3
推荐指数
1
解决办法
359
查看次数