18

フラグメントを使用するアプリがあり、そのすべてが1つのアクティビティに含まれています。アクティビティは、ボタンのメニューを含むフラグメントで始まります。これらすべてにより、さまざまなリストフラグメントが元のボタン/メニューフラグメントを置き換えます。

私の問題は、向きを変更すると、アクティビティがリストビューの1つを表示している場合、それが消えてボタンメニューに戻ることです。なぜこれが起こっているのか理解しています...アクティビティが破棄されて再作成されますが、それを回避し、向きの変更を通じてリストビュー/現在のフラグメントを維持する方法はわかりません。

ここsetRetainInstanceで使用例を見つけましたが、ボタンメニューを使用して自分の状況に適用する方法や、保持したいフラグメントがいくつかの異なるフラグメントの1つである可能性を理解できません。

以下は、メインアクティビティとリストフラグメントの1つを示すために簡略化されたコードです。

リストフラグメントが保持されるように、どこに追加するかについてのポインタをいただければ幸いです。

アクティビティ

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);        
    }
}
4

2 に答える 2

35

それを回避し、向きの変更を通じてリストビュー/現在のフラグメントを維持する方法

onCreate()が呼び出されるたびに、盲目的にフラグメントを置き換えています。代わりに、がの場合にのみフラグメントを追加/置換しsavedInstanceState()ますnull。そうでない場合はnull、構成の変更から戻ってきて、既存のフラグメントが再作成されます(または、保持されている場合は、すでに存在しています)。

setRetainInstance(true)フラグメント自体は、アクティビティのように破棄/再作成されるのではなく、構成の変更後も保持されることを意味します。ただし、それでも。で呼び出されonCreateView()ます。あなたのコードでは、それはあなたのデータメンバーItemListFragmentが固執することを意味します、しかしあなたがsetListAdapter()データベースを再クエリしなくてもあなたはまだ呼び出す必要があるでしょう。

于 2012-05-05T16:20:55.923 に答える
0

これはずっと前に解決されたことは知っていますが、向きの変更中にリストを保持することに関して私が(繰り返し)抱えていたのと同じくらい多くの問題を抱えている解決策を探している人々のために、あなたができることを追加したいと思いますlistadapter のデータのリストを保持するカスタム クラスも使用します。

このようにして、アクティビティ(およびリストフラグメント)を再作成するときにデータを保持し、oncreate にデータがあるかどうかをテストできます。list == nullまたは の場合は、list.size < 0通常どおり続行し、通常の方法でデータを取得します。それ以外の場合は、listadapter に既にあるデータを設定するだけです。

私にとっては、これははるかに簡単であり、Android マスター/詳細フロー プロジェクトを作成するときに、Eclipse がデータ用に同様の DummyContent クラスを自動的に作成するのを見ると、基本的にリストフラグメントの oncreate を変更するだけで済みます。

于 2014-04-29T13:20:11.327 に答える