所以,我在这里看过几篇帖子,表明获取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。任何提示为什么会发生这种情况将不胜感激。
感谢
答案 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(): ... } }