从片段中获取Activity的布局并阻止其所有子节点

时间:2015-09-18 12:39:53

标签: android-layout android-fragments

我在多个活动上使用片段来显示ShowCaseView,一切都很好,但我想在演示期间禁用ShowCaseView概述的控件,防止在演示结束前点击它们。< / p>

就像那样:

getActivity().getWindow().getDecorView().findViewById(android.R.id.content).findViewById(R.id.btnJournal).setEnabled(false);

我可以禁用我所知道的一个元素,但是我希望得到该视图的所有子元素,并且在没有明确写入其ID的情况下将它们全部禁用,但我使用getActivity().getWindow().getDecorView().findViewById(android.R.id.content)获得的是View而不是ViewGroup或LinearLayout,如果我把它投射到ViewGroup - 它找不到任何子节点,如果我将它转换为LinearLayout,那么,好吧:

`Caused by: java.lang.ClassCastException: com.android.internal.policy.impl.PhoneWindow$DecorView cannot be cast to android.widget.LinearLayout`

我怎样才能遍历它的孩子?

1 个答案:

答案 0 :(得分:0)

我找到了下一个解决方案:

首先,我使用了来自here的代码段 - 感谢MH。获得所有孩子的观点:

private List<View> getAllChildrenBFS(View v) {
    List<View> visited = new ArrayList<View>();
    List<View> unvisited = new ArrayList<View>();
    unvisited.add(v);

    while (!unvisited.isEmpty()) {
        View child = unvisited.remove(0);
        visited.add(child);
        if (!(child instanceof ViewGroup)) continue;
        ViewGroup group = (ViewGroup) child;
        final int childCount = group.getChildCount();
        for (int i=0; i<childCount; i++) unvisited.add(group.getChildAt(i));
    }

    return visited;
}

所以,在我的Fragment代码中,我编写了引用内容视图并禁用下一代码设置控件:

ViewGroup mRootView = (ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content);
    for (View v : getAllChildrenBFS(mRootView)) v.setEnabled(false);

然后在作业完成后设置类似的代码:

ViewGroup mRootView = (ViewGroup) getActivity().getWindow().getDecorView().findViewById(android.R.id.content);
    for (View v : getAllChildrenBFS(mRootView)) v.setEnabled(true);

所以,现在我感到很高兴,我没有花一整天的时间来做任何事情))