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

我正在研究一个库,它将提供一些input字段的片段。 这些input字段将包含使用我的图书馆的应用程序不应该访问的用户的私人信息。 因此,edittexts或者我们可以说片段的布局不能从活动(findViewById,getChildAt ..)被连接到的地方访问。

对话框或其他活动的使用是不可接受的,这个片段应该被直接包含在活动的布局中。

这在Android中甚至可能吗?

我正在考虑dynamic地创build视图,并重写getChildAt等方法来阻止访问子视图,但在我开始“玩”这个问题之前,我宁愿在这里问一些意见。

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

Android不提供这种用法的模型。 压倒一切的方法肯定会使得难以获得这些观点,但并非不可能。 您的自定义视图类必须将其子项存储在某处。 即使这是一个私人领域,反思也可以访问它。

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

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

创build类BaseFragment并使用Base Fragment扩展您的每个类必须重写它的getView()

在这些接近你必须删除根视图作为类成员getView返回相同

 public class BaseFragment extends Fragment { @Nullable @Override public View getView() { super.getView(); } } 

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

使用私有访问BaseFragment创buildboolean boolean canAccess = true; 没有getter和setter,并将getView()定义更改为

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

你必须为你的每个子构造函数调用super() ,现在如果你在类中访问getViewcanAccess是真的,所以你将得到实际的视图,否则你会得到空值。

根据文件

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

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

第二个select是最简单的

 @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(); } } 

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

 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 

这种方法将适用于片段和适配器来禁用/启用其内容。

我想我没有正确理解,但我认为私人访问模式创build的任何内容都不能从外部访问。

你有没有考虑使用webview你的特定问题!

做一个片段,并在其中显示您所需的网页视图,并让用户input任何他喜欢的东西。

通过这个其他应用程序不会有权访问EditTexts。

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