gpt4 book ai didi

android - 使用 View 绑定(bind)时如何处理不同布局配置中缺少的 View ?

转载 作者:行者123 更新时间:2023-12-05 00:18:44 25 4
gpt4 key购买 nike

我知道任何带有 ID 的 XML 元素都应该通过 View 绑定(bind)自动拉入 Activity 类。但是,Android Studio 一直提示我的按钮可以为 null,需要有 ?.!!. 才能编译。

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

为什么 View 绑定(bind)无法识别我的按钮的类型和存在?

我的主要 Activity 代码在这里:

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
}

}

此处应用程序的 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"
android:layout_marginTop="50dp"
android:text="Caculate Your"
android:textColor="@color/headingColor"
android:textSize="30sp"
android:textStyle="bold" />

<TextView
android:id="@+id/tvAge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="Age"
android:textColor="@color/white"
android:background="@color/purple_200"
android:padding="10sp"
android:textSize="30sp"
android:textStyle="bold" />

<TextView
android:id="@+id/tvInMinutes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="In Minutes"
android:textColor="@color/headingColor"
android:textSize="30sp"
android:textStyle="bold" />

<Button
android:id="@+id/btnSelectDate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Select Date"
android:layout_marginTop="10sp"
android:textSize="20sp"
android:backgroundTint="@color/buttonColor"
/>

<TextView
android:id="@+id/tvSelectedDate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:textColor="@color/headingColor"
android:textSize="20sp"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Selected Date"
android:layout_marginTop="2dp"
android:textColor="@color/gray"
android:textSize="20sp"
/>

<TextView
android:id="@+id/tvAgeInMinutes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:textColor="@color/headingColor"
android:textSize="36sp"
android:textStyle="bold"
/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Age in minutes"
android:layout_marginTop="2dp"
android:textColor="@color/gray"
android:textSize="24sp"
/>


</LinearLayout>

我找出了罪魁祸首,它在 View 绑定(bind)文档上说:

Null safety: Since view binding creates direct references to views, there's no risk of a null pointer exception due to an invalid view ID. Additionally, when a view is only present in some configurations of a layout, the field containing its reference in the binding class is marked with @Nullable

来源:https://developer.android.com/topic/libraries/view-binding#findviewbyid

我按钮中的一条规则仅在 API 21 或更高版本中使用,我当前的最小值设置为 16(请参见下面的屏幕截图)。我按照 Android Studio 的建议覆盖了版本,从而创建了 2 个单独的 activity_main.xml。这就是触发可空行为的原因。

API restriction creating multiple xml files

当我删除 v21 xml 文件时,可空值消失了。

现在,在我对阅读本文的人提出的后续问题中,为什么断言不可为空仍然会导致应用程序崩溃?使用多个 activity_main.xml 版本处理此问题的正确方法是什么?

提前致谢!

最佳答案

我找出了罪魁祸首,它在 View 绑定(bind)文档上说:

Null safety: Since view binding creates direct references to views, there's no risk of a null pointer exception due to an invalid view ID. Additionally, when a view is only present in some configurations of a layout, the field containing its reference in the binding class is marked with @Nullable

来源:https://developer.android.com/topic/libraries/view-binding#findviewbyid

我按钮中的一条规则仅在 API 21 或更高版本中使用,我当前的最小值设置为 16(请参见下面的屏幕截图)。我按照 Android Studio 的建议覆盖了版本,从而创建了 2 个单独的 activity_main.xml。这就是触发可空行为的原因。

API restriction creating multiple xml files

当我删除 v21 xml 文件时,可空值消失了。

现在,在我对阅读本文的人提出的后续问题中,为什么断言不可为空仍然会导致应用程序崩溃?使用多个 activity_main.xml 版本处理此问题的正确方法是什么?

关于android - 使用 View 绑定(bind)时如何处理不同布局配置中缺少的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66937070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com