因此,我有一个屏幕,其中包含0到6个通过XML包含的相同用户界面组件。类似的东西:
<TableRow android:layout_height="150px">
<include android:id="@+id/p1" android:layout_width="fill_parent"
android:layout_height="wrap_content" layout="@layout/numerics_component"
android:onClick="onClick" />
</TableRow>
<TableRow android:layout_height="150px">
<include android:id="@+id/p2" android:layout_width="fill_parent"
android:layout_height="wrap_content" layout="@layout/numerics_component"
android:layout_below="@id/p1" android:onClick="onClick" />
</TableRow>
...等
其中每个UI都是我正在重用的几个小部件和自定义组件的集合。
我想在我的Activity中检测那些包含位中的组件的点击并进行适当的响应。问题是,在我的onClick方法中,如果我遵循常见模式,我永远无法分辨哪些视图得到了点击:
public void onClick(View view) {
Log.d(loggingName, "Got onClick event on view: " + view);
// Identify the view, and handle appropriately:
switch (view.getId()) {
...
使用上面的代码,我永远无法分辨出组件的6个副本中的哪一个被点击了。必须有一个很好的方法来做到这一点,但我没有看到它。
此外,我不想将可重用组件硬编码为一个活动,因为我想在我的应用程序中的多个活动中重复使用它。理想情况下,我可以在我的Activity中设置监听器。
关于我如何做到这一点的任何想法?
谢谢!
答案 0 :(得分:1)
1)Android View类允许您通过setTag方法标记视图的每个实例。
所以,只有setTag()
在每个视图上有一些唯一的Integer,或者甚至是一个带有你将调用的方法的对象。然后在您的点击监听器中,只需执行getTag()
来区分各种视图实例。
2)您可以在每个视图实例上放置一个唯一的onClickListener。
3)您可以在每个视图实例上执行findViewById()
,并将它们存储在成员变量,数组或其他一些数据结构中。然后在onClickListener
中,您只需将传递给onClick()
的视图引用与已保存的引用列表进行比较。
答案 1 :(得分:1)
您可以搜索层次结构以确定单击了哪个子组件。我看到你表中的每一行都有一个唯一的id。因此,即使使用相同的id重复布局,视图层次结构也不会在任何子树中具有相同的ID。
因此,要识别单击了哪个子组件,请获取父视图的id(在您的情况下是一行),并查看该视图所属的6行中的哪一行。这有意义吗?