是否可以禁止从父活动访问片段的布局(视图)?

时间:2016-04-12 15:28:14

标签: android android-fragments android-activity

我正在开发一个库,它将为片段提供一些输入字段。这些输入字段将包含用户的私人信息,使用我的库的应用程序无权访问。因此,edittexts或我们可以说片段的布局无法从附加此片段的活动(findViewById,getChildAt ..)访问。

不接受使用对话框或其他活动,此片段应直接包含在活动的布局中。

这在Android中甚至可能吗?

我正在考虑动态创建视图,并覆盖getChildAt等方法以防止访问子视图,但在我开始之前#34;播放"有了这个问题,我宁愿在这里问一些意见。

6 个答案:

答案 0 :(得分:3)

Android不提供此类用法的模型。 重写方法肯定会使访问这些视图变得更加困难,但并非不可能。您的自定义视图类必须将其子项存储在某个位置。即使这是私有字段,反射也可以访问它。

活动可以完全控制他的内容,我认为你不能阻止它。

答案 1 :(得分:2)

首先,你想要的不是一个好的方法,我建议的只是一个想法,它没有经过测试和推荐,但可以做你的工作

创建类 BaseFragment 并使用Base Fragment扩展每个类 必须覆盖其getView()

在这些方法中,您必须删除根视图作为类成员getView返回相同的

public class BaseFragment extends Fragment {

    @Nullable
    @Override
    public View getView() {
     super.getView();
    }
}

现在你可以用两种方式做到这一点

使用私人访问权限 booleanBaseFragment中创建boolean canAccess = true;,不使用getter和setter,并将getView()的定义更改为

public BaseFragment() {
    canAccess = false;
}

@Nullable
@Override
public View getView() {
    if(canAccess)
        return super.getView();
    return 
        null;
}

您必须为每个子构造函数调用super(),现在如果您在类getView中访问canAccess为真,那么您将获得实际视图,否则您将获得null。

根据文件

  

获取片段布局的根视图({@link #onCreateView}返回的那个),

     

如果提供@return片段的根视图,如果没有布局则为null。

第二个选项最简单

@Nullable
@Override
public View getView() {
    try {
        throw new Exception("Who called me?");
    } catch (Exception e) {
        String className = e.getStackTrace()[1].getClass().getCanonicalName();
        if (className.equals(YourParentActivity.class.getCanonicalName()))
            return null;
        else
            return super.getView();
    }
}

答案 2 :(得分:1)

您可以使用以下方法禁用片段内的内容:

public void enableDisableViewGroup(ViewGroup viewGroup, boolean enabled) {
    int childCount = viewGroup.getChildCount();
    for(int i = 0; i < childCount; i++) {
        View view = viewGroup.getChildAt(i);
        view.setEnabled(enabled);
        if (view instanceof ViewGroup) {
            enableDisableViewGroup((ViewGroup) view, enabled);
        }
    }
}

您只需按以下方式调用上述方法:

enableDisableViewGroup((ViewGroup) rootView, true); // disable

enableDisableViewGroup((ViewGroup) rootView, false); // enable

此方法适用于片段和适配器以禁用/启用其内容。

答案 3 :(得分:0)

我猜我没理解,但我认为无法从外部访问由私有访问模式创建的任何内容。

答案 4 :(得分:0)

你有没有考虑过使用webview来解决你的特定问题!!!

创建一个片段,然后在其中显示您想要的webview,并让用户输入他喜欢的任何内容。

这样,OTHER APP将无法访问EditTexts。

答案 5 :(得分:0)

您可以覆盖TextView的getText()并为私有视图返回null。如果有人会得到这个文本视图 - 他将无法获得它的内容。