18

如果我有如下布局,如何使用 kotlin 合成扩展访问视图:

文件:two_days_view.xml

<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:orientation="vertical">

    <include
        android:id="@+id/day1"
        layout="@layout/day_row"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <include
        android:id="@+id/day2"
        layout="@layout/day_row"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

文件:day_row.xml

   <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"       >

        <TextView
            android:id="@+id/dayName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

如何访问dayName?我找了一些这样的:

day1.dayName.text = "xxx"
day2.dayName.text = "sss"

我在 Studio 中看到我可以访问dayName但 dayName TextView 引用的是哪一个?

正常,如果我只有一个包含的布局,它可以正常工作。但现在我多次包含相同的布局。

当然我总是可以这样做:

day1.findViewById(R.id.dayName).text = "xxx"

但我正在寻找好的解决方案。:)

4

2 回答 2

52

作为一般的经验法则,您不应该构建最终具有相同 id 的多个视图的布局 - 正是出于这个原因。

但是,要解决您的问题:而不是导入

kotlinx.android.synthetic.main.layout.day_row.*

你可以导入

kotlinx.android.synthetic.main.layout.day_row.view.*(注意最后的附加内容.view)。

这将不会将视图作为 Activity/Fragment 级别的属性导入,而是作为View. 这样,您可以按照您想要的方式进行操作,假设day1day2包含您想要的视图:

day1.dayName.text = "xxx"
day2.dayName.text = "sss"
于 2017-02-24T15:22:19.900 回答
-2

在这种情况下,请使用:

(day1 as TextView).text = ""
(day2 as TextView).text = ""
于 2018-10-19T00:34:15.417 回答