Android - 获取活动/片段中所包含的父视图的ID

时间:2015-09-28 12:22:25

标签: android view casting onclicklistener parent

所以,我在这里看过几篇帖子,表明获取Android中任何子视图的父视图ID的最佳解决方案就是这样:

View parent = (View)child.getParent();
int id = parent.getId();

不幸的是,这在我的案例中并不适用。我有一个自定义ViewGroup(扩展FrameLayout),带有2个按钮,一个textView和一个需要在按钮点击时更新的栏。

class WaveControl extends FrameLayout{
    Button minus;
    Button plus;
    ExpandingBar bar; //simple view that only draws a color(need for indication purposes)
    int counter;
  }

扩展栏需要在按钮点击时生成动画,我有方法在WaveControl内部处理。我还有一个有五个WaveControls的片段,我需要在片段中实现一个onClickListener来应用一个过滤器,具体取决于点击/更新了哪个WaveControls。但即使我实现了上面的代码,我也会得到不同的ID,例如:

WaveControl wc1; // (in xml id is field_1)
WaveControl wc2; // (in xml if is field_2)
WaveControl wc3; //...
WaveControl wc4; //...

wc1.minus.setOnclickListener(this);
wc2.plus.setOnclickListener(this);
.... //this for every button

@Override
public void OnClick(View v){
    View parent = (View)v.getParent();
    int id = parent.getId();
    Log.i(TAG, "view id: "+ id +"   wc1 id: " + field1.getId());
    switch(v.getId()){
       case R.id.minus:
          ...
    }
 }

输出为:I/WaveFragment﹕ view id: -1 wc1 id: 2131624083 显然,这不能作为一个指标,即被点击的视图。 我已经想到了为每个waveControl字段制作几个onClickListener的解决方法,但它似乎并不是完美的解决方案。 问题仍然存在:将ViewParent转换为View将无法获得片段中放置的视图的实际ID。任何提示为什么会发生这种情况将不胜感激。 感谢

1 个答案:

答案 0 :(得分:0)

不是比较" id" s,而是比较"视图"可能会奏效。 为此,您应该初始化要比较的视图。 例如:

View minus = (View) wc1.findViewById(R.id.minus); //or wc1.minus
switch(v){
       case minus:
...
}

编辑: 在您的代码中,您将视图的ID与视图进行比较。我想比较两个ID可以解决你的问题。

@Override
public void OnClick(View v){
    View parent = (View)v.getParent();
    int id = parent.getId();
    Log.i(TAG, "view id: "+ id +"   wc1 id: " + field1.getId());
    switch(v.getId()){
       case wc1.minus.getId():
          ...
      case wc1.plus.getId():
          ...
      case wc2.minus.getId():
          ...
      case wc2.plus.getId():
          ...

    }
 }