以下のようなレイアウトの場合、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"
しかし、私はニースの解決策を探しています。 :)
一般的な経験則として、同じ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"
「レイアウトのブロックにkotlin.synteticを使用することの危険性」 https://link.medium.com/rMwau5VAZT
私も同じケースでした。これは私がそれを機能させた方法です:
私の活動/フラグメントのレイアウト:
<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>
タグ機能しませんでした