我有一个使用片段的应用程序,所有这些片段都包含在一个活动中。活动以包含按钮菜单的片段开始,所有这些按钮都会导致各种listfragments替换原始按钮/菜单片段。
我的问题是,在更改方向时,如果活动正在显示其中一个列表视图,它将消失并返回按钮菜单。我理解为什么会发生这种情况......活动被破坏并重新创建,但不是如何解决它并通过方向更改维护列表视图/当前片段。
我找到setRetainInstance
以及使用here的示例,但我无法弄清楚如何将其应用于我的情况,使用按钮菜单或我想要的片段的可能性保留可能是几个不同的之一。
下面是简化的代码,用于显示主要活动和其中一个listfragments。
任何关于添加内容的指针都将非常感谢,以便保留列表片段。
活动
public class Main extends FragmentActivity {
private MainMenuFragment menu;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
menu = new MainMenuFragment();
getSupportFragmentManager().beginTransaction().replace(R.id.pane, menu).commit();
}
}
ListFragment
public class ItemListFragment extends ListFragment {
private TextView header;
private TextView empty;
private Button add;
public static Cursor itemCursor;
private GroceryDB mDbHelper;
public static long mRowId;
public static CheckCursorAdapter lists;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.common_list, container, false);
header = (TextView) v.findViewById(R.id.header);
empty = (TextView) v.findViewById(android.R.id.empty);
header.setText(R.string.header_item);
empty.setText(R.string.empty_items);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mRowId=0;
mDbHelper = new GroceryDB(getActivity());
mDbHelper.open();
itemCursor = mDbHelper.fetchAllItems();
getActivity().startManagingCursor(itemCursor);
String[] from = new String[] { GroceryDB.ITEM_NAME };
int[] to = new int[] { R.id.ListItem };
lists = new CheckCursorAdapter(getActivity(),
R.layout.listlayout_itemlist, itemCursor, from, to);
setListAdapter(lists);
}
}
答案 0 :(得分:35)
如何解决它并通过方向更改维护列表视图/当前片段
每次调用onCreate()
时,您都会盲目地替换片段。相反,只有savedInstanceState()
为null
时才添加/替换片段。如果它不是null
,那么您将从配置更改中返回,并且将重新创建现有片段(或者,如果它们被保留,则它们已经存在)。
setRetainInstance(true)
表示片段本身将在配置更改中保留,而不是像活动那样被销毁/重新创建。但是,仍然会使用onCreateView()
调用它。在您的代码中,这意味着ItemListFragment
的数据成员会留下来,但即使您不重新查询数据库,仍然需要调用setListAdapter()
。
答案 1 :(得分:0)
我知道很久以前就已经解决了这个问题,但是为了寻找一个解决方案的人,我希望在方向改变期间有多少问题(我反复)有保留名单另外,您还可以使用自定义类来保存listadapter的数据列表。
这样它可以在重新创建活动(和listfragment)时保留数据,您可以测试它是否在您的oncreate中有任何数据。如果您list == null
或list.size < 0
照常进行,并以正常方式获取数据。否则,您只需使用已有的数据设置listadapter。
对我而言,这更容易,并且看到Eclipse在创建android主/详细信息流项目时自动为您的数据创建类似的DummyContent类,它基本上只需要更改listfragment的oncreate。