如何处理重复自定义组件的点击/触摸?

时间:2011-07-11 23:40:16

标签: android android-layout

因此,我有一个屏幕,其中包含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中设置监听器。

关于我如何做到这一点的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

1)Android View类允许您通过setTag方法标记视图的每个实例。

所以,只有setTag()在每个视图上有一些唯一的Integer,或者甚至是一个带有你将调用的方法的对象。然后在您的点击监听器中,只需执行getTag()来区分各种视图实例。

2)您可以在每个视图实例上放置一个唯一的onClickListener。

3)您可以在每个视图实例上执行findViewById(),并将它们存储在成员变量,数组或其他一些数据结构中。然后在onClickListener中,您只需将传递给onClick()的视图引用与已保存的引用列表进行比较。

答案 1 :(得分:1)

您可以搜索层次结构以确定单击了哪个子组件。我看到你表中的每一行都有一个唯一的id。因此,即使使用相同的id重复布局,视图层次结构也不会在任何子树中具有相同的ID。

因此,要识别单击了哪个子组件,请获取父视图的id(在您的情况下是一行),并查看该视图所属的6行中的哪一行。这有意义吗?