获得视图的伟大的大父母观点的最佳途径?

时间:2017-02-09 04:21:19

标签: android view parent android-databinding

我需要获得伟大的祖父母观点的参考。目前我正在使用以下代码成功完成:

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>

感谢您的建议。

1 个答案:

答案 0 :(得分: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){ ... }

您需要在数据绑定中为任何引用的视图使用camel case写入。

您还可以传递视图的属性。 (例如VisibilityisChecked,...)

Here是乔治山的一篇文章,他使用此文章(在“查看属性”下)。 (仅限其他属性,但我认为你会明白这一点)