获取视图的 Great Grand Parent 视图的最佳方式?
Best Way to Get the View's Great Great Grand Parent View?
我需要参考曾曾祖父母的观点。目前我正在使用以下代码成功地做到这一点:
FabToolbar fabToolbar = (FabToolbar) view.getParent().getParent().getParent().getParent();
这似乎有些可笑,或者,这只是完成的方式吗?
我这样做的原因是因为我更喜欢在我的布局中使用数据绑定,而且我无法获得对任何视图的引用,除了被点击的视图。这给出了您将在下面看到的以下代码,例如:
@{(view) -> viewModel.onClickPart(view)}
传递给该方法的视图是 MaterialIconView,这似乎是我唯一可以引用的视图,或者有没有办法将其他参数传递给该方法?我的完整布局如下,请记住 FabToolbar 包含一个 LinearLayout child 和一个 RelativeLayout child,因此您看到对 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>
谢谢你的建议。
您可以使用 DataBinding
:
从布局中传递其他 Views
<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
、...)
Here 是 George Mount 的一篇文章,他在其中使用了这个(在 "View attributes" 下)。 (仅适用于其他属性,但我想您会明白的)
我需要参考曾曾祖父母的观点。目前我正在使用以下代码成功地做到这一点:
FabToolbar fabToolbar = (FabToolbar) view.getParent().getParent().getParent().getParent();
这似乎有些可笑,或者,这只是完成的方式吗?
我这样做的原因是因为我更喜欢在我的布局中使用数据绑定,而且我无法获得对任何视图的引用,除了被点击的视图。这给出了您将在下面看到的以下代码,例如:
@{(view) -> viewModel.onClickPart(view)}
传递给该方法的视图是 MaterialIconView,这似乎是我唯一可以引用的视图,或者有没有办法将其他参数传递给该方法?我的完整布局如下,请记住 FabToolbar 包含一个 LinearLayout child 和一个 RelativeLayout child,因此您看到对 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>
谢谢你的建议。
您可以使用 DataBinding
:
Views
<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
、...)
Here 是 George Mount 的一篇文章,他在其中使用了这个(在 "View attributes" 下)。 (仅适用于其他属性,但我想您会明白的)