【问题标题】:Is it possible to disable access to fragment's layout(views) from parent activity?是否可以禁止从父活动访问片段的布局(视图)?
【发布时间】:2016-04-12 15:28:14
【问题描述】:

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

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

这在 Android 中是否可行?

我正在考虑动态创建视图,并覆盖诸如 getChildAt 之类的方法以防止访问子视图,但在我开始“玩”这个问题之前,我宁愿在这里征求一些意见。

【问题讨论】:

  • 我唯一的想法是在您的 EditTexts 上安装 TextWatchers,这将对输入的数据进行即时加密。例如,将真实的私有数据存储在 Keystore 系统的某个地方。但不知道如何实现这个:)
  • @GoltsevEugene 使用加密不是坏主意,好点。
  • 您可以禁用所有视图的触摸事件并覆盖 Fragment 的 getView 方法并返回 null。这样没有人可以使用这种方法获得您的 Fragment 视图......这就是我的想法......

标签: android android-fragments android-activity


【解决方案1】:

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

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

【讨论】:

  • 是的,你是对的,Android 不是为这样的事情而构建的,但我很好奇是否有人遇到过这个问题。我想,如果这个问题有答案,实现起来并不容易:(。(很多覆盖,加密)。我会再等几天等待其他意见..
【解决方案2】:

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

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

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

public class BaseFragment extends Fragment {

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

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

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

public BaseFragment() {
    canAccess = false;
}

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

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

根据文档

获取片段布局的根视图(由 {@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();
    }
}

【讨论】:

  • 一些不错的想法,但它也依赖于可以通过使用反射修改的布尔canAccess
  • 第二个选项没有任何布尔值,而且很简单
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 由于 java 反射,不能接受私有访问
    【解决方案5】:

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

    制作一个片段并在其中显示您想要的网页视图,并让用户输入他喜欢的任何内容。

    这样,其他应用程序将无法访问 EditTexts。

    【讨论】:

    • 是的,我也考虑过这个选项,但是 webview 可以从外部访问,这意味着它也是内容..
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多