从 Fragment 获取 Activity 的布局并阻止其所有子项
Posted
技术标签:
【中文标题】从 Fragment 获取 Activity 的布局并阻止其所有子项【英文标题】:Get Activity's layout from a Fragment and block all its childs 【发布时间】:2015-09-18 12:39:53 【问题描述】:我在多个活动上使用 Fragment 来显示 ShowCaseView,一切都很好,但我想禁用 ShowCaseView 在演示期间概述的控件,防止在演示结束之前单击它们。
这样:
getActivity().getWindow().getDecorView().findViewById(android.R.id.content).findViewById(R.id.btnJournal).setEnabled(false);
我可以禁用我知道的一个元素,但我想获取该 View 的所有子元素并在不显式写入其 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】:我找到了下一个解决方案:
首先我使用了来自here 的代码 sn-p - 感谢 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 代码中,我编写了对 Content View 的引用并设置禁用下一个代码的控件:
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);
所以现在我很酷很高兴我没有白白度过一整天))
【讨论】:
以上是关于从 Fragment 获取 Activity 的布局并阻止其所有子项的主要内容,如果未能解决你的问题,请参考以下文章
将数据从 Fragment Activity 传输到 Fragment