it-swarm.dev

Syntetyczne rozszerzenie Kotlin i kilka zawiera ten sam układ

Jak uzyskać dostęp do widoku za pomocą rozszerzenia syntetycznego kotlin, jeśli mam układ podobny do poniższego:

plik: 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>

plik: 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>

Jak uzyskać dostęp do dayName? Szukałem czegoś takiego:

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

Widzę w Studio, że mam dostęp do zmiennej dayName, ale do której z dayName TextView odnosi się?

Normalnie, jeśli mam tylko jeden dołączony układ, działa dobrze. Ale teraz mam wiele razy ten sam układ.

oczywiście zawsze mogę zrobić:

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

ale szukam miłego rozwiązania. :)

8
LunaVulpo

Zgodnie z ogólną zasadą, nie powinieneś konstruować układów, które kończą się wieloma widokami o tym samym identyfikatorze - z tego powodu.

Ale, aby rozwiązać problem: Zamiast importować

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

możesz importować

kotlinx.Android.synthetic.main.layout.day_row.view.* (Zwróć uwagę na dodatkowy kod .view na końcu).

Spowoduje to zaimportowanie widoków nie jako właściwości na poziomie Activity/Fragment, ale zamiast tego jako właściwości rozszerzenia dla View. W ten sposób możesz to zrobić tak, jak chcesz, zakładając, że day1 i day2 zawierają widoki, które chcesz:

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

„Niebezpieczeństwo użycia kotlin.syntetic dla bloku w układzie” https://link.medium.com/rMwau5VAZT

0
Werder

Miałem tę samą sprawę. W ten sposób sprawiłem, że to działa:

Układ w mojej aktywności/fragmencie:

    <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" />

Układ: 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>

Kod Kotlina:

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

Zwróć uwagę na widok główny <FrameLayout>. To tylko działało dla mnie w ten sposób.

Używanie tagu <merge> nie działa

0
voghDev