应该设置时,变量保持为空

时间:2016-06-27 22:24:05

标签: java android recursion view null

我有一个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;
}

1 个答案:

答案 0 :(得分:1)

我认为你的两个问题是同一个问题: v 的最终价值仅来自最后一次调用,而不是成功的。您获得所需值的唯一时间是它在搜索的最后一个分支中。

主要问题是当你找到它时你不会停下来。重写逻辑做两件事:

  1. 返回找到的项目(或NULL)作为功能值(将 void 更改为查看并删除 v 参数)。
  2. 在循环中捕获此返回值,并且只要它为NULL就继续。当你获得良好的价值时休息。无论您的循环退出方法如何,都要返回找到的“最佳”值(成功或失败)。
  3. 我没有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;
    }
    

    您之前的版本未能返回成功结果。您可以稍微清理一下这个逻辑流程,但我试图将这些更改保持在最低限度。