Kotlin合成扩展和几个包括相同的布局

时间:2017-02-24 09:38:31

标签: android kotlin kotlin-android-extensions

如果我有如下布局,如何使用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>

file: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 个答案:

答案 0 :(得分:28)

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

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

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

你可以导入

kotlinx.android.synthetic.main.layout.day_row.view.*(注意最后的额外.view。)

这将导致视图不作为活动/片段级别的属性导入,而是作为View的扩展属性导入。这样,假设day1day2包含您想要的视图,您可以按照自己的方式进行操作:

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

答案 1 :(得分:0)

我有同样的情况。这就是我工作的方式:

我的活动/片段中的布局:

    <include
        android:id="@+id/field1"
        layout="@layout/merge_field"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <include
        android:id="@+id/field2"
        layout="@layout/merge_field"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

布局:merge_field.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mergeContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content">

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

</FrameLayout>

Kotlin代码:

val tv_title = field1?.findViewById(R.id.tv_title)
tv_title.text = "This way it works"

请注意<FrameLayout>根视图。 以这种方式为我工作。

使用<merge>代码无法使用

答案 2 :(得分:0)

“使用kotlin.syntetic进行布局块化的危险” https://link.medium.com/rMwau5VAZT

答案 3 :(得分:-1)

在这种情况下,请使用:

(day1 as TextView).text = ""
(day2 as TextView).text = ""