我有一个View对象,我尝试设置它。但是,它始终保持null
在函数之外。在这里我尝试设置它作为参数传递,我也试过return
- 声明,但没有用。最有可能的是,因为问题出在其他地方而且我无法看到它。奇怪的是,它足够在内部设置功能,但外部仍为空。代码:
private EditText mView = null;
public void findViewByTag(ViewGroup vg, Object obj, View v) {
if (vg == null)
return;
for (int i = 0; i < vg.getChildCount(); i++) {
if (vg.getChildAt(i).getTag() != null) {
if (vg.getChildAt(i).getTag().toString().equals(obj)) {
Log.d("Found", "Yes." + obj.toString());//here it does get found
v = vg.getChildAt(i);
//tested, it is not null HERE
return;
}
}
}
for (int i = 0; i < vg.getChildCount(); i++) {
if (vg.getChildAt(i) instanceof ViewGroup) {
findViewByTag((ViewGroup) vg.getChildAt(i), obj, v);
}
}
}
然后我称之为findViewbyTag(mViewGroup, "_MyTag", mView)
。在这里,我发现mView == null
。
作为一个附带问题,如何在找到所有视图后停止递归迭代我的所有视图?有没有办法阻止它迭代其他视图分支?可能不是,但仍然。
编辑: 如上所述,这也没有解决。
public View findViewByTag(ViewGroup vg, Object obj) {
if (vg == null)
return null;
for (int i = 0; i < vg.getChildCount(); i++) {
//because some are not set and we don't like NullPtrs
if (vg.getChildAt(i).getTag() != null) {
if (vg.getChildAt(i).getTag().toString().equals(obj)) {
Log.d("Found", "Yes." + obj.toString());
return vg.getChildAt(i);
}
}
}
for (int i = 0; i < vg.getChildCount(); i++) {
if (vg.getChildAt(i) instanceof ViewGroup) {
findViewByTag((ViewGroup) vg.getChildAt(i), obj);
}
}
return null;
}
答案 0 :(得分:1)
我认为你的两个问题是同一个问题: v 的最终价值仅来自最后一次调用,而不是成功的。您获得所需值的唯一时间是它在搜索的最后一个分支中。
主要问题是当你找到它时你不会停下来。重写逻辑做两件事:
我没有JRE可以在这里进行测试,但让我尝试盲目编辑:
public View findViewByTag(ViewGroup vg, Object obj) {
result = null
if (vg == null)
return null;
for (int i = 0; i < vg.getChildCount(); i++) {
//because some are not set and we don't like NullPtrs
if (vg.getChildAt(i).getTag() != null) {
if (vg.getChildAt(i).getTag().toString().equals(obj)) {
Log.d("Found", "Yes." + obj.toString());
result = vg.getChildAt(i);
}
}
}
for (int i = 0; i < vg.getChildCount(); i++) {
if (vg.getChildAt(i) instanceof ViewGroup) {
result = findViewByTag((ViewGroup) vg.getChildAt(i), obj);
if (result) break;
}
}
return result;
}
您之前的版本未能返回成功结果。您可以稍微清理一下这个逻辑流程,但我试图将这些更改保持在最低限度。