Android -在activity/fragment中获取父视图的id



所以,我在这里看到了几个帖子,建议在Android中获得任何子视图的父视图id的最佳解决方案是:

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

不幸的是,这在我的情况下不起作用。我有一个自定义ViewGroup (extends framayout)与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中有一些方法来处理这个问题。我也有一个片段,它有五个wavecontrol,我需要在片段中实现一个onClickListener来应用一个过滤器,这取决于哪个wavecontrol被点击/更新。但是,即使我实现了上面的代码,我也会得到不同的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字段创建几个onClickListeners,但这似乎不是完美的解决方案。问题仍然存在:将ViewParent转换为View不会让你得到fragment中View的实际id。任何提示为什么会发生这种情况将不胜感激。由于

与其比较"id",还不如比较"views"。为此,您应该初始化要比较的视图。例如:

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():
          ...
    }
 }

最新更新