我最近开始在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.谷歌肯定没有这么难以实现这样的事情,我必须遗漏一些东西?任何有关如何正确维护片段视图状态的帮助将不胜感激!
谢谢.
我很难找到关于此的确切细节,所以我希望在这里得到一些帮助.我正在寻找有关iOS共享NSHTTPCookieStorage的底层存储机制的一些信息:
如果一个人必须处理cookie中的一些敏感数据,但想要利用NSURLSession API的默认cookie处理/存储(共享NSHTTPCookieStorage),那么什么才是最佳选择?
对不起,我知道我已经问了3个单独的问题,但对此的任何帮助将不胜感激.
谢谢.
我正在寻找为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)