2011-07-11 42 views
4

因此,我有一个屏幕,其中包含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的是几个小部件,而且我重用自定义组件的集合。

我想检测点击在我的活动包括位中的组件,并适当地作出响应。问题是,在我的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中设置监听器。

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

谢谢!

回答

1

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

因此,只有setTag()对每个视图有一些独特的整数,甚至可能是一个对象与您将调用的方法。然后在您的点击监听器中,只需执行getTag()即可区分各种视图实例。

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

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

+0

因此,基本上当我的Activity加载时,它需要循环遍历6个可能的包含区域,并将setTag()中的每个组件都带有ID?这似乎会起作用,但它的丑陋地狱。我会给它一个镜头并回报。谢谢! –

+0

您也可以在每个View实例上设置一个唯一的点击处理程序。但这并不难看。由于某些我不知道的原因,View.getId()不能可靠地工作。 – mportuesisf

+0

增加了一个选项 - 将保存的对象引用与传递给onClick()的值进行比较。看到我编辑的答案。 – mportuesisf

1

您可以搜索层次结构来确定哪个子组件已被点击。我发现表格的每一行都有唯一的ID。因此,即使布局是用相同的ID重复的,视图层次结构在任何子树中都没有相同的ID。

因此,要确定哪个子组件已被点击,请获取父视图的ID(在您的情况下是一行)并查看视图所属的6行中的哪一行。那有意义吗?