gpt4 book ai didi

Android - 在 UI Fragment 中保留对象

转载 作者:行者123 更新时间:2023-11-29 01:35:55 25 4
gpt4 key购买 nike

在我的项目中,我最初使用的是这个方案:

Activity A (UI) > Fragment B (non-UI) > Adapter + AsyncTask

  • B 使用 setRetainInstance(true) 保留并更新 A UI
  • A 使用 getFragmentManager()
  • 实例化 B

但是我现在需要使用UI Fragments,所以我想到了使用这个方案:

Activity A > Fragment B (UI) > Fragment C (non-UI) > Adapter + AsyncTask

  • C 保留 setRetainInstance(true) 并更新 B UI
  • B 使用 getChildFragmentManager()
  • 实例化 C

但似乎不可能:

Caused by: java.lang.IllegalStateException:
Can't retain fragements that are nested in other fragments

我尝试使用 getFragmentManager() 而不是 getChildFragmentManager() 来实例化 C,但我遇到了一些问题。


在 Fragment 中保留对象和管理 AsyncTasks 的最佳实践是什么?

最佳答案

我终于开发了一个小助手类:

public class RetainFragment<F extends Fragment> extends Fragment {

private static <F extends Fragment> String tag(F ui, Object id) {
return ui.getClass().getName() + id.toString();
}

public static <F extends Fragment> Fragment get(F ui, Object id) {
return ui.getFragmentManager().findFragmentByTag(tag(ui, id));
}

public F ui;
public Object id;

@Override
public void onCreate(Bundle state) {
super.onCreate(state);
setRetainInstance(true);
}

public void link(F ui, Object id) {
this.id = id;
this.ui = ui;
if (get(ui, id) == null) {
ui.getFragmentManager()
.beginTransaction()
.add(this, tag(ui, id))
.commit();
}
}

public void unlink() {
if (get(ui, id) != null) {
ui.getFragmentManager()
.beginTransaction()
.remove(this)
.commit();
}
ui = null;
id = null;
}

}

现在,在 UI Fragments 中,我只写:

public class UiFragment extends Fragment {

private static class Retain extends RetainFragment<UiFragment> {
private MyAsyncTask task; // Objects to retain over
private MyAdapter adapter; // configuration changes
}

private Retain retain;

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
retain = (Retain) Retain.get(this, 0);
if (retain == null) {
retain = new Retain();
// Retained objects initialization
retain.adapter = new MyAdapter();
}
retain.link(this, 0);
}

@Override
public void onDetach() {
if (isRemoving()) {
// Retained objects terminate
if (retain.task != null) {
retain.task.cancel(true);
}
retain.unlink();
}
super.onDetach();
}

private void update() {
if (!isDetached()) {
// Update UI fragment
}
}

}

retain.task.onPostExecute() 中:

retain.ui.update(); // Reference to the last ui fragment instance linked

并在 UI fragment 启动时启动任务:

private static class Retain extends RetainFragment<UiFragment> {
private MyAsyncTask task; // Objects to retain over
private MyAdapter adapter; // configuration changes

@Override
public void onCreate(Bundle state) {
super.onCreate(state);
ui.onRetainCreated();
}
}

private void onRetainCreated() {
retain.task = new MyAsyncTask() {
@Override
protected void onPostExecute(Void result) {
retain.ui.update();
}
};
retain.task.execute();
}

关于Android - 在 UI Fragment 中保留对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28080495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com