MST
星途 面试题库

面试题:Kotlin Android扩展插件中视图绑定相关问题

在使用Kotlin Android扩展插件进行视图绑定的时候,如何处理布局文件中多个同名id的视图?请举例说明。
38.4万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

在Kotlin Android扩展插件中,不能直接处理布局文件中多个同名id的视图。因为Kotlin Android扩展插件是基于视图id生成绑定代码的,同名id会导致生成代码时产生冲突。

通常建议避免在布局文件中使用多个同名id。如果确实有这种需求,可以使用findViewById的方式来分别获取这些视图。例如:

  1. 布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/same_id_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第一个文本" />

    <TextView
        android:id="@+id/same_id_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第二个文本" />

</LinearLayout>
  1. Kotlin代码
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val textView1 = findViewById<TextView>(R.id.same_id_text)
        val textView2 = findViewById<TextView>(R.id.same_id_text)

        // 此时textView1和textView2获取到的可能是同一个视图或者根据布局加载顺序获取不同视图(不推荐这种获取方式)
        // 具体行为依赖于Android系统在这种不规范情况下的处理逻辑
    }
}

为了代码的清晰和可维护性,应避免这种情况,为每个视图赋予唯一的id。例如:

  1. 修改后的布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text_view_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第一个文本" />

    <TextView
        android:id="@+id/text_view_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="第二个文本" />

</LinearLayout>
  1. Kotlin代码
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val textView1 = text_view_1
        val textView2 = text_view_2

        // 这样通过Kotlin Android扩展插件可以清晰地获取到不同的视图
    }
}