所以,我在这里看到了几个帖子,建议在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(): ... } }