我现在正在 Kotlin 中使用 viewBinding。
这是我的 build.gradle

启用 ViewBinding 并具有自动导入 ViewBinding 依赖项。
但 Android Studio 仍然显示这样的错误

但我可以毫无问题地构建和运行。
如果我在依赖项中添加 viewBinding,那么错误就会消失。
有谁知道为什么?
更新:
我知道为什么。我正在使用 AndroidX,IDE 说无法访问“android.viewbinding.ViewBinding”,但我的依赖项是 AndroidX,它是“androidx.viewbinding.ViewBinding”,包名称已更改。
解决方案:将 android.useAndroidX=true 添加到项目 gradle.properties 文件中。
全局 gradle.properties 设置不起作用,不知道为什么。
我正在尝试在添加到项目中的新模块中使用 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) 我有一个带有按钮的活动。在按钮上单击“我想更新文本视图中的文本”。我想用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) 据我所知,任何带有 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) 在我的片段布局中,我添加了一个包含 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) 我注意到在 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)
但是,一旦我设置compileOptions为JavaVersion.VERSION_11,AndroidStudio 总是错误地显示 viewBiding(s) 错误,尽管它可以毫无问题地编译和运行。
我在 AndroidStudio ArcticFox 中使用一个全新的项目对此进行了测试。它建议导入类。导入后,显示未找到包:
这是 AndroidStudio 的错误,还是我的 AndroidStudio 中的 Java 编译器设置有任何错误配置?
我所做的只是一些特别的事情JavaVersion.VERSION_11。
我正在尝试在 jetpack compose 中使用一些片段,但无法从 (androidx.compose.ui.viewinterop) 导入 AndroidViewBinding,并且它始终显示为未解析的名称
怎么导入呢??
xml-layout android-jetpack-compose android-viewbinding composable
我正在我的新应用中试验视图绑定。今天突然当我运行该应用程序时,它显示空白屏幕而不是 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
我发现自己为我创建的每个新片段编写样板代码。这包括设置视图模型和视图绑定,这是我的代码的 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
在我的 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