18

我有一個應用程序使用片段,所有這些都包含在單個活動中。該活動以包含按鈕菜單的片段開始,所有這些都會導致各種列表片段替換原始按鈕/菜單片段。在方向變化的列表片段中保留列表

我的問題是,在方向改變時,如果活動顯示其中一個列表視圖,它將消失,並返回按鈕菜單。我明白爲什麼會發生這種情況......活動被破壞並重新創建,而不是如何解決它並通過方向更改來維護列表視圖/當前片段。

我發現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);   
    } 
} 

回答

34

如何解決它,並通過更改方向保持列表視圖/當前片段

每次調用onCreate()時,都會盲目地更換片段。相反,如果savedInstanceState()null,則只能添加/替換片段。如果它不是null,那麼您將從配置更改返回,並且您現有的片段將被重新創建(或者,如果它們被保留,它們已經存在)。

setRetainInstance(true)意味着片段本身將在配置更改中保留,而不是像活動一樣被銷燬/重新創建。但是,它仍將被調用onCreateView()。在您的代碼中,這意味着您的數據成員ItemListFragment會繼續存在,但即使您不重新查詢數據庫,仍需要致電setListAdapter()

+0

那麼,這是令人難以置信的尷尬(更不用說愚蠢的我)。我**知道我應該檢查savedInstanceState(),但由於某種原因,我沒有這樣做,甚至從來沒有想過它。感謝您的快速回復。 – Barak

0

我知道這已經很久以前解決了,但爲了尋找解決方案的人尋求解決方案時遇到問題,因此我希望補充一點,你也可以使用一個自定義類來保存listadapter的數據列表。

通過這種方式,它可以在重新創建活動(和listfragment)時保留數據,並且您可以測試它是否在創建時有任何數據。如果list == nulllist.size < 0像往常一樣繼續進行操作,並以通常得到的方式獲取數據。否則,只需使用已有的數據設置listadapter即可。

對我來說,這很容易,並且看到Eclipse在創建android主/明細流項目時自動爲您的數據創建類似的DummyContent類,它基本上只需要更改listfragment的oncreate。