如何确定哪个RelativeLayout是按钮的父级?

时间:2012-03-10 01:13:55

标签: android android-layout android-linearlayout relativelayout

让我们说我有两种不同类型的RelativeLayouts。也就是说这两个RelativeLayouts不同,因为它们包含不同的视图。一个可能有文本视图,图像视图等,另一个可能也有一些文本视图,这意味着与另一个relativelayout中的另一组文本视图完全不同。但是让我们说它们都有一个提交按钮。所以,为了使我的观点更清楚,这里有一些代码:

     @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        ViewParent parent = v.getParent();
        if(parent instanceof CustomRelativeLayout){

            CustomRelativeLayout aRelativeLayout = (CustomRelativeLayout)parent;                    

            for(int childrenIndex = 0; childrenIndex < r.getChildCount(); childrenIndex++){

                View childView = aRelativeLayout.getChildAt(childrenIndex);    


            }
        }

    }

这里的问题是我们不知道哪个CustomRelativeLayout是aRelativeLayout所指的。具体取决于我将要搜索哪些特定的childView以及我实现的与这些视图相关的逻辑,具体取决于哪个CustomRelativeLayout。我希望能够有一个switch语句来检查哪种类型的CustomRelativeLayout是父类。

所以我想问的问题是:

  1. 如何获取有关哪个CustomRelativeLayout实例引用所点击按钮的更多信息?有没有办法获取实例变量名称?

  2. 一旦我发现了这些信息,我如何获得有关我正在处理的父视图子项的具体信息?我的想法是,我可能在父母中有30个子视图,但我只对一个特定视图感兴趣(我可能想以一个特定文本视图的文本为例)。我会知道特别寻找它,因为我会在我的CustomRelativeLayouts的不同实例(第一个问题)上做一个switch语句,因此我知道我想看哪个视图,要执行哪个逻辑或者我有什么其他方法需要打电话。

  3. 感谢任何想法或帮助。

2 个答案:

答案 0 :(得分:2)

对于您的第一个问题,有几个选项:

  • 为每个按钮使用单独的OnClickListener s。然后,每个按钮只会触发自己的监听器onClick()方法。
  • 您可以在XML(通过android:id属性)或代码(通过setId(int id))中为每个按钮指定不同的ID。然后在onClick()中,您可以检查作为参数传递的View的ID。

关于你的第二个问题:

由于您拥有父ViewGroup,因此可以使用以下命令查找其中的特定视图:

TextView interestingView = (TextView) parent.findViewById(R.id.interesting);

这只会搜索父视图的子项。

如果你需要获得未知数量的观点,那么最好的策略可能就像你现在一样迭代它们。您可以通过以XML(android:tag)或代码(setTag(Object tag)设置标记来标识视图组,并在迭代时检查它们。例如,如果您有一组TextView s并且在每一个都是颜色或动物,你可能会这样处理:

// defined elsewhere
private static final String TAG_COLOR = "color";
private static final String TAG_ANIMAL = "animal";

...

int count = parent.getChildCount();
for (int i = 0; i < count; i++){
    View view = parent.getChildAt(i);
    if (TAG_COLOR.equals(view.getTag()) {
        // handle color
    } else if (TAG_ANIMAL.equals(view.getTag()) {
        // handle animal
    }
}

答案 1 :(得分:0)

有几种方法可以做到这一点。

  1. 使用“id”标识视图。您可以为不同的视图提供不同的ID,然后就可以识别它们。有关详细信息,请参阅http://developer.android.com/reference/android/view/View.html#getId()(View.getId()的API文档)。

  2. 使用不同的标记标记每个视图,并通过标记识别它们。有关详细信息,请参阅http://developer.android.com/reference/android/view/View.html#getTag()(View.getTag()的API文档)。

  3. 如果您想要自定义更多内容,只需继承默认的Android视图,并使用“instanceof”来识别它们。