web-dev-qa-db-ja.com

Kotlin合成拡張機能といくつかは同じレイアウトを含みます

以下のようなレイアウトの場合、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のどれが参照されていますか?

含まれているレイアウトが1つしかない場合は正常に機能します。しかし、今は同じレイアウトが複数回含まれています。

もちろん、私はいつでもできます:

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

しかし、私はニースの解決策を探しています。 :)

16
LunaVulpo

一般的な経験則として、同じIDを持つ複数のビューを持つレイアウトを作成するべきではありません-これこそまさに理由です。

しかし、問題を解決するには:インポートする代わりに

kotlinx.Android.synthetic.main.layout.day_row.*

インポートできます

kotlinx.Android.synthetic.main.layout.day_row.view.*(追加の.view 最後に)。

これは、ビューをアクティビティ/フラグメントレベルのプロパティとしてではなく、Viewの拡張プロパティとしてインポートします。そうすれば、day1およびday2必要なビューを含めます。

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

「レイアウトのブロックにkotlin.synteticを使用することの危険性」 https://link.medium.com/rMwau5VAZT

0
Werder

私も同じケースでした。これは私がそれを機能させた方法です:

私の活動/フラグメントのレイアウト:

    <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>ルートビュー。それonlyはこのように私のために働きました。

を使って <merge>タグ機能しませんでした

0
voghDev