Лучший способ получить вид Great Great Grand Parent View?

Мне нужно получить ссылку на мнение великого прапрадедушки. В настоящее время я делаю это успешно, используя следующий код:

FabToolbar fabToolbar = (FabToolbar) view.getParent().getParent().getParent().getParent();

Это кажется несколько смешным, или это просто способ, которым это делается?

Причина, по которой я сделал это таким образом, заключалась в том, что я предпочитал использовать привязку данных в своем макете и не мог получить ссылку на какое-либо представление, кроме представления, по которому щелкнули. Это дает следующий код, который вы увидите ниже, например:

@{(view) -> viewModel.onClickPart(view)}

Представление, передаваемое в метод, — это MaterialIconView, похоже, это единственное представление, на которое я могу ссылаться, или есть способ передать дополнительные параметры этому методу? Мой полный макет показан ниже, имейте в виду, что FabToolbar содержит дочерний элемент LinearLayout и дочерний элемент RelativeLayout, поэтому вы видите четыре вызова getParent(), а не два (посмотрите на макет ниже).

<com.bowyer.app.fabtoolbar.FabToolbar
            android:id="@+id/fab_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            app:tb_anim_duration="400"
            app:tb_color="@color/primary"
            app:tb_container_gravity="center"
            app:tb_fab_type="normal">

        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/accent"
                android:gravity="center"
                android:orientation="horizontal">

            <net.steamcrafted.materialiconlib.MaterialIconView
                    android:id="@+id/ic_part"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:onClick="@{(view) -> viewModel.onClickPart(view)}"
                    android:layout_marginLeft="@dimen/content_space"
                    android:layout_marginRight="@dimen/content_space"
                    android:background="@null"
                    android:scaleType="center"
                    app:materialIcon="engine"
                    app:materialIconColor="#fff"
                    app:materialIconSize="24dp"
                    />

            <net.steamcrafted.materialiconlib.MaterialIconView
                    android:id="@+id/ic_dyno"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:onClick="@{(view) -> viewModel.onClickDyno(view)}"
                    android:layout_marginLeft="@dimen/content_space"
                    android:layout_marginRight="@dimen/content_space"
                    android:background="@null"
                    android:scaleType="center"
                    app:materialIcon="chart_line"
                    app:materialIconColor="#fff"
                    app:materialIconSize="24dp"
                    />

            <net.steamcrafted.materialiconlib.MaterialIconView
                    android:id="@+id/ic_timeslip"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:onClick="@{(view) -> viewModel.onClickTimeslip(view)}"
                    android:layout_marginLeft="@dimen/content_space"
                    android:layout_marginRight="@dimen/content_space"
                    android:background="@null"
                    android:scaleType="center"
                    app:materialIcon="timer_10"
                    app:materialIconColor="#fff"
                    app:materialIconSize="24dp"
                    />

            <net.steamcrafted.materialiconlib.MaterialIconView
                    android:id="@+id/ic_laptime"
                    android:layout_width="48dp"
                    android:onClick="@{(view) -> viewModel.onClickLaptime(view)}"
                    android:layout_height="48dp"
                    android:layout_marginLeft="@dimen/content_space"
                    android:layout_marginRight="@dimen/content_space"
                    android:background="@null"
                    android:scaleType="center"
                    app:materialIcon="timer"
                    app:materialIconColor="#fff"
                    app:materialIconSize="24dp"
                    />

            <net.steamcrafted.materialiconlib.MaterialIconView
                    android:id="@+id/ic_fuel"
                    android:layout_width="48dp"
                    android:onClick="@{(view) -> viewModel.onClickFuel(view)}"
                    android:layout_height="48dp"
                    android:layout_marginLeft="@dimen/content_space"
                    android:layout_marginRight="@dimen/content_space"
                    android:background="@null"
                    android:scaleType="center"
                    app:materialIcon="gas_station"
                    app:materialIconColor="#fff"
                    app:materialIconSize="24dp"
                    />

            <net.steamcrafted.materialiconlib.MaterialIconView
                    android:id="@+id/ic_repair"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:onClick="@{(view) -> viewModel.onClickRepair(view)}"
                    android:layout_marginLeft="@dimen/content_space"
                    android:layout_marginRight="@dimen/content_space"
                    android:background="@null"
                    android:scaleType="center"
                    app:materialIcon="wrench"
                    app:materialIconColor="#fff"
                    app:materialIconSize="24dp"
                    />
        </LinearLayout>

    </com.bowyer.app.fabtoolbar.FabToolbar>

Спасибо за совет.


person AutoM8R    schedule 09.02.2017    source источник
comment
Эй, я добавил ответ вскоре после первого. Вы уже прочитали это? Можно передать представление в прослушивателе onclick. :)   -  person yennsarah    schedule 09.02.2017


Ответы (1)


Вы можете передать другие Views из своего макета с помощью DataBinding:

<com.bowyer.app.fabtoolbar.FabToolbar
        android:id="@+id/fab_toolbar">

    <LinearLayout>

        <net.steamcrafted.materialiconlib.MaterialIconView
                android:id="@+id/ic_part"
                android:onClick="@{(view) -> viewModel.onClickPart(view, fabToolbar)}"/>

    </LinearLayout>

</com.bowyer.app.fabtoolbar.FabToolbar>

В вашем ViewModel:

public void onClickPart(View view, FabToolbar fabToolbar){ ... }

Вам нужно использовать запись верблюда для любого представления, на которое ссылаются в привязке данных.

Вы также можете передавать свойства такого представления. (например, Visibility, isChecked, ...)

Вот статья Джорджа Маунта, где он использует это (в разделе «Атрибуты просмотра»). (Только для других свойств, но я думаю, вы поняли идею)

person yennsarah    schedule 09.02.2017
comment
Большое спасибо! Я хотел бы узнать больше о синтаксисе, используемом для привязки данных. Не могли бы вы объяснить, как называется этот синтаксис, то есть @{(view) -> viewModel.onClickPart(view, fabToolbar)}? На данный момент это похоже на Вулкан, но я уверен, что это логично. - person AutoM8R; 10.02.2017
comment
Кажется, это называется «лямбда-выражение», вот еще одна статья Джорджа Маунта (он и Йигит разработали библиотеку привязки данных), где он объясняет события кликов :) Я рад, что смог вам помочь! - person yennsarah; 10.02.2017
comment
Спасибо @Amylinn - person AutoM8R; 18.02.2017