从 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和activity之间进行数据交互

Fragment 和 Activity 之间通信

将数据从 Fragment Activity 传输到 Fragment

从 Activity 完成异步后在 Fragment 上填充 ListView

如何在activity中获取fragment的控件,然后修改控件的内容,