我在多个活动上使用片段来显示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`
我怎样才能遍历它的孩子?
答案 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);
所以,现在我感到很高兴,我没有花一整天的时间来做任何事情))