小编Ste*_*son的帖子

选项卡主机中的Android Fragment视图状态

可能重复:
使用片段为Android中的每个选项卡分隔后台堆栈

我最近开始在FragmentActivity中的标签主机内部开发一个带有片段的应用程序.由于TabActivity类现已弃用,因此Android文档说这样做.为了使用片段,我使用的是android v4支持库.

目前我的应用程序包含一个选项卡,其中存在片段.要导航到选项卡中的新片段,我一直在使用以下代码(根据文档似乎是正确的):

FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(containerId, newFragment);
ft.addToBackStack(null);
ft.commit();
Run Code Online (Sandbox Code Playgroud)

一切顺利,直到我按下后退键导航到前一个片段并意识到我的所有视图状态几乎都被破坏了......发生的事情是onCreateView()方法在我之前的片段上再次被调用即使之前已经创建了它的观点......为什么会这样?我已经四处搜索了如何使用片段正确维护状态,但我似乎无法在此找到合适的文档.

然后我尝试使用的是

ft.add(containerId, newFragment);
Run Code Online (Sandbox Code Playgroud)

代替

ft.replace(containerId, newFragment);
Run Code Online (Sandbox Code Playgroud)

这实际上工作得很好,因为我的视图状态被保留了 - 每次显示我之前的片段时都没有调用onCreateView().然而,我接着注意到的是,我可以与位于当前片段下方的先前片段的组件(按钮等)进行交互,即使我看不到组件!?我在某处读到应该使用以下方法来保存一些状态:

public void onSaveInstanceState (Bundle outState)
Run Code Online (Sandbox Code Playgroud)

我实现了这个方法,但它从未被调用过!我还注意到,过去onCreateView()和onActivityCreated()方法的bundle总是为null.谷歌肯定没有这么难以实现这样的事情,我必须遗漏一些东西?任何有关如何正确维护片段视图状态的帮助将不胜感激!

谢谢.

android android-fragments

6
推荐指数
1
解决办法
4676
查看次数

围绕iOS的安全性共享NSHTTPCookieStorage

我很难找到关于此的确切细节,所以我希望在这里得到一些帮助.我正在寻找有关iOS共享NSHTTPCookieStorage的底层存储机制的一些信息:

  • 当使用共享NSHTTPCookieStorage存储cookie时,默认情况下是否提供任何加密,例如使用钥匙串服务?或者使用NSUserDefaults将cookie简单地存储在纯文本中?
  • 我知道cookie存储在应用程序的沙箱中,因此其他应用程序无法访问,但我的理解是正确的,有物理访问设备的人可以轻松访问应用程序的cookie及其值(特别是如果它们未加密存储) )?

如果一个人必须处理cookie中的一些敏感数据,但想要利用NSURLSession API的默认cookie处理/存储(共享NSHTTPCookieStorage),那么什么才是最佳选择?

对不起,我知道我已经问了3个单独的问题,但对此的任何帮助将不胜感激.

谢谢.

security cookies ios nshttpcookiestorage

5
推荐指数
1
解决办法
457
查看次数

Java 8:从 HashMap 获取默认值并更新底层映射

我正在寻找为HashMapget 操作提供默认值的最佳方法(可读性和效率),但如果值尚不存在,还要使用该默认值更新底层映射。

我知道那里有 3rd 方库,但我更愿意坚持使用标准 Java。以下是我想到的一些不同的方法:

老套

Map<String, List<Integer>> someIntegerListLookup = new HashMap<>();
String key = "key";
...
List<Integer> integerList = someIntegerListLookup.get(key);

if (integerList == null) {
    integerList = new ArrayList<>();
    someIntegerListLookup.put(key, integerList);
}
Run Code Online (Sandbox Code Playgroud)

Java 8 Map 方法

// getOrDefault
List<Integer> integerList = someIntegerListLookup.getOrDefault(key, new ArrayList<>());
someIntegerListLookup.put(key, integerList);

// putIfAbsent
someIntegerListLookup.putIfAbsent(key, new ArrayList<>());
List<Integer> integerList = someIntegerListLookup.get(key);
Run Code Online (Sandbox Code Playgroud)

使用 Java 8 可选

List<Integer> integerList = 
    Optional.ofNullable(someIntegerListLookup.putIfAbsent(key, new ArrayList<>()))
    .orElse(someIntegerListLookup.get(key));
Run Code Online (Sandbox Code Playgroud)

从可读性的角度来看,不喜欢这种方法。

使用“或其他”供应商:

List<Integer> integerList = Optional.ofNullable(someIntegerListLookup.get(key))
    .orElseGet(() -> {
        // …
Run Code Online (Sandbox Code Playgroud)

java hashmap java-8

5
推荐指数
2
解决办法
154
查看次数