标签: android-viewbinding

为什么使用绑定类的视图引用被标记为@Nullable?

我有一个带有一些 TextView 和 CardView 的布局。只有引用 binding.mycardview 返回一个对象CardView?,但根据文档

空安全:由于视图绑定创建对视图的直接引用,因此不存在因视图 ID 无效而导致空指针异常的风险。此外,当视图仅出现在布局的某些配置中时,绑定类中包含其引用的字段将标记为 @Nullable。

我的布局 row.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <androidx.cardview.widget.CardView
        android:id="@+id/cVComune"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/space"
        android:layout_marginTop="@dimen/space"
        android:layout_marginEnd="@dimen/space"
        android:layout_marginBottom="@dimen/space"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

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

            <TextView
                android:id="@+id/tvComune"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/space"
                android:layout_marginTop="@dimen/space"
                android:textSize="@dimen/text_label_medium"
                android:textStyle="bold"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:id="@+id/tvCap"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/space"
                android:layout_marginTop="@dimen/space"
                android:textSize="@dimen/text_label_medium"
                app:layout_constraintStart_toEndOf="@+id/ivMail"
                app:layout_constraintTop_toBottomOf="@+id/tvComune" />

            <TextView
                android:id="@+id/tvPrefisso"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/space"
                android:layout_marginTop="@dimen/space"
                android:textSize="@dimen/text_label_medium"
                app:layout_constraintStart_toEndOf="@+id/ivPhone"
                app:layout_constraintTop_toBottomOf="@+id/tvComune" />

            <TextView
                android:id="@+id/tvAbitanti"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginStart="@dimen/space"
                android:layout_marginTop="@dimen/space"
                android:textSize="@dimen/text_label_medium"
                app:layout_constraintStart_toEndOf="@+id/ivAbitanti"
                app:layout_constraintTop_toBottomOf="@+id/tvComune" …
Run Code Online (Sandbox Code Playgroud)

xml android kotlin-null-safety android-viewbinding

8
推荐指数
1
解决办法
1337
查看次数

ViewBinding - 不同风味的布局资源

我有一个风格,其中包含与我的main源集中相同的布局资源。这是因为它用特定的风味覆盖了主要的。我在很多地方都这样做过,在我引入ViewBinding. 为准确起见,布局是“包含”在片段中的嵌套布局。

这是结构:

main
 - res 
 - - layout 
 - - - layout_sign_up_details_fields.xml
flavor 
 - res 
 - - layout 
 - - - layout_sign_up_details_fields.xml

Run Code Online (Sandbox Code Playgroud)

til_sudf_first_name在我的主要资源中没有的特定于风味的布局资源中有一个视图,其 ID 是。这是有意的。View通过在运行此构建变体时查看生成的源,我可以看到这是在我的绑定类中“绑定”的。

main
 - res 
 - - layout 
 - - - layout_sign_up_details_fields.xml
flavor 
 - res 
 - - layout 
 - - - layout_sign_up_details_fields.xml

Run Code Online (Sandbox Code Playgroud)

现在实际绑定发生在“基”类中,并使用protected可见性修饰符与子类共享,如下所示:

@NonNull
public final TextInputLayout tilSudfFirstName;
Run Code Online (Sandbox Code Playgroud)

问题是detailsBinding不包含我需要的视图,即使它存在于生成的类中。

此外,另一个奇怪的事情是,即使main布局文件中存在不在特定于风味的布局文件中的视图,它们仍然包含在生成的布局文件中。

我正在尝试做的甚至可能吗?我可用的解决方法是对这个实例使用 kotlin 的综合视图处理,因为我一直在尝试使用推荐的方法

data-binding android android-layout android-flavors android-viewbinding

7
推荐指数
1
解决办法
1487
查看次数

为什么使用视图绑定会改变布局?

实际代码:

我的主要活动:

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

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

        val rollButton = binding.rollButton
        rollButton.setOnClickListener { rollDice() }

        setContentView(binding.root)
    }

    private fun rollDice() {
        val randomDiceRoll = Random.nextInt(6) + 1
        Toast.makeText(this, randomDiceRoll.toString(), Toast.LENGTH_SHORT).show()
        binding.resultText.text = randomDiceRoll.toString()
    }
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: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">

    <TextView
        android:id="@+id/result_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/count"
        android:textSize="30sp" />

    <Button
        android:id="@+id/roll_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/roll" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

在android studio中预览: …

android android-layout kotlin android-viewbinding

7
推荐指数
1
解决办法
2682
查看次数

使用 2 种可能的布局查看绑定,将绑定变量分配给 2 个生成的绑定类

所需功能:

我有一个活动,它有一个从后端接收到的值,该值指示使用两种布局之一。我们将此值称为layoutType,并假设为简单起见,在下面的示例代码中,我们不关心如何分配它。因此,我有两个布局 xml 文件,我们称它们为layout1.xmllayout2.xml

实现: 我想使用View Binding。我创建了一个ViewBinding类型的变量,并尝试为其分配Layout1BindingLayout2Binding。这个逻辑的伪代码总结如下:

 private ViewBinding binding;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

     if(layoutType == 1){
         binding = Layout1Binding.inflate(getLayoutInflater());
     } else {
         binding = Layout2Binding.inflate(getLayoutInflater());
     }
     setContentView(binding.getRoot());
 }
Run Code Online (Sandbox Code Playgroud)

结果:当然,这不起作用,变量绑定似乎没有可以引用的内部子级。另外,当然如果我将变量的类型转换为Layout1Binding并且layoutType等于1,那么我就可以正确使用它。如果我使用Layout2Binding并且layoutType不等于 1,情况也是如此。所有这些都是有意义的,因为 ViewBinding 只是由生成的类Layout1BindingLayout2Binding实现的接口。

问题:如何仅使用一个可以分配给两个不同生成类的绑定变量来实现上述所需的行为?还有其他替代方法吗?

java android android-layout android-viewbinding

7
推荐指数
1
解决办法
2874
查看次数

使用视图绑定时如何解决“数据绑定未启用”错误

我正在使用视图绑定,为此我使用了以下代码。

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

我得到了这个错误:

> [databinding] {"msg":"Found \u003clayout\u003e but data binding is not
> enabled.\n\nAdd buildFeatures.dataBinding \u003d true to your
> build.gradle to enable
> it.","file":"C:\\Users\\akash\\AndroidStudioProjects\\NavigationSafeArgs\\app\\src\\main\\res\\layout\\fragment_home.xml","pos":[]}
Run Code Online (Sandbox Code Playgroud)

读完抛出的错误后,我认为它是说启用dataBinding所以我dataBinding true也在里面添加了buildFeatures。它仍然抛出同样的错误。

这是我的fragment_home.xml代码;

<?xml version="1.0" encoding="utf-8"?>
<layout>
<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="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".HomeFragment">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:text="@string/home_screen"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />

    <Button
        android:id="@+id/button_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/login" />
</LinearLayout>
</layout>

   
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack android-viewbinding

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

视图绑定无权访问片段

我有一个活动及其ConstraintLayout片段:

<androidx.constraintlayout.widget.ConstraintLayout 
 ...attributes....
>
  <fragment
     android:id="@+id/containerView"
     app:navGraph="@navigation/some_navigation"
     ...other attributes...
   />

  ...other views...
Run Code Online (Sandbox Code Playgroud)

我在活动代码中使用视图绑定:

  binding = ActivityMainBinding.inflate(layoutInflater)
Run Code Online (Sandbox Code Playgroud)

这里的问题是我无法访问binding.containerView. 万一fragment我应该使用findViewById

android android-fragments android-viewbinding

7
推荐指数
1
解决办法
2046
查看次数

可疑的缩进:这是缩进的,但没有继续前面的表达式

Android studio 向我展示了这个问题,代码行下方有红线

“可疑的缩进:这是缩进的,但没有继续前面的表达式(binding.cllInternetA...)(这里是前面的语句)”

显示问题时的 Android Studio 屏幕截图

override fun onResume() {
    super.onResume()
    //Clear search edit text
    binding.etSearch.text?.clear()

    lookUpNumberVM.isInternetLiveData.observe(viewLifecycleOwner) {
        if (it) {
            binding.cllMain.visibility = View.VISIBLE
            binding.cllInternetAvailability.visibility = View.GONE
        } else {
            binding.cllMain.visibility = View.GONE
            binding.cllInternetAvailability.visibility = View.VISIBLE
              makeSnackBar(binding.root,"No internet connection")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的代码在上面,您可以在附带问题的屏幕截图中看到问题。我会非常感谢你的努力。

data-binding android android-viewbinding

7
推荐指数
2
解决办法
9253
查看次数

ViewBinding GeneratedCode 在哪里

如何/在哪里可以找到为 ViewBinding 生成的代码?

每当我尝试 control+click/control+b 来查看声明时,AndroidStudio 都会打开 XML 布局。

android generated-code android-studio android-viewbinding

6
推荐指数
1
解决办法
1043
查看次数

ViewBinding - 如何在 ViewBinding 中设置包含布局的可见性?

我使用包含布局,我需要更改它的可见性:

 <include
    android:id="@+id/layout_provinces"
    layout="@layout/layout_select_provinces"
     />
Run Code Online (Sandbox Code Playgroud)

而 layout_select_provinces 是这样的:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/select_province"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:background="@color/white"
 android:visibility="gone">

    <LinearLayout
        android:id="@+id/layout_top"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/background_color"
        android:orientation="vertical">

        <TextView
            android:id="@+id/txt_state"
            style="@style/FontIranBold"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="@dimen/_8sdp"
            android:layout_marginRight="@dimen/_4sdp"
            android:layout_marginBottom="@dimen/_8sdp"
            android:text="@string/txt_select_province"
            android:textSize="@dimen/font_size_small" />

        <View
            android:layout_width="match_parent"
            android:layout_height="@dimen/_1sdp"
            android:background="@color/gray_special" />

    </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_estate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/layout_top"
        android:layout_marginTop="@dimen/_8sdp" />
Run Code Online (Sandbox Code Playgroud)

但是当我将 Id 设置为 RelativeLayout 时,我的应用程序崩溃并且我无法更改可见性:

     binding.layoutProvinces.selectProvince.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

有没有人可以帮助我处理 ViewBinding 设置 ID 过程?

android-layout android-view android-viewbinding

6
推荐指数
1
解决办法
1542
查看次数

启用视图绑定后,Android Studio 会给出错误和警告。怎么修?

在我的项目中启用视图绑定后出现错误。

我尝试重新同步项目,使缓存无效。我的应用程序gradle文件:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"

    defaultConfig {
        applicationId "com.learning.aboutme"
        minSdkVersion 19
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

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

    viewBinding.enabled = true

}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.13'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
Run Code Online (Sandbox Code Playgroud)

我的项目gradle文件

// Top-level build file where you can add configuration options …
Run Code Online (Sandbox Code Playgroud)

android gradle kotlin android-viewbinding

6
推荐指数
3
解决办法
1718
查看次数