0

向きを変更した後、現在のフラグメントの状態を保存するのに問題があります。フラグメントのナビゲーション プロセスで置き換える gridview のフラグメントがあります。アプリ起動後のアクション。

1) 「MainActivity」を起動します。

2) 「CenterPanelFragment」を追加します (これは内部フラグメントのコンテナーです)。

3)「CenterPanelFragment」フラグメント「FragmentCatalog」(GridView)で置き換えます。写真1。

4)「FragmentCatalog」のグリッドビュー項目をクリックすると、フラグメント「FragmentCatalogStone」(Gridview)が補充されます。写真2。

5)その後、デバイスの向きを変更します。ご覧のとおり、横向きのフラグメント「FragmentCatalogStone」ではなく、横向きのフラグメント「FragmentCatalog」を取得しています。写真3

私が間違っていることは何ですか?必要なクラスファイルを添付しました。

私の下手な英語でごめんなさい。

どうもありがとう!

1 2 3

MainActivity.java

CenterPanelFragment.java

FragmentCatalog.java

FragmentCatalogStone.java

4

3 に答える 3

1

問題を解決する方法を見つけました。アクティビティのマニフェストに追加android:configChanges="orientation|screenSize"しただけで、うまくいきました!

于 2013-09-25T10:41:42.987 に答える
0

私はあなたのコードを完全には理解していないかもしれませんが、あなたの MainActivity の onCreate でこのビットを疑っています:

    frAdapter = new FragmentAdapter(getSupportFragmentManager());

    vPager = (ViewPager)findViewById(R.id.pager);
    vPager.setAdapter(frAdapter);

    vPager.setCurrentItem(1);

    vPager.setOnPageChangeListener(this);
    vPager.setOffscreenPageLimit(3);

currentItem を onSaveInstance に保存して取得する必要があると考えてください。

    vPager.setCurrentItem(value_before_orientation_change);

ただし、vPager が実際にフラグメントを上書きするかどうかは 100% わかりません。

編集:

さらに可能性が高いのは、onActivityCreated の CenterPanelFragment.java で、カタログをコミットすることです。

    fragmentTransaction.replace(R.id.fragment_container, fragmentCatalog);
    fragmentTransaction.addToBackStack("FragmentCatalog");
    fragmentTransaction.commit();

CenterPanelFragment の onCreate の setRetainInstance(true) のような単純なもので、この問題を解決できるかもしれません。

方向の変更によって CenterPanelFragment が再起動され、onActivityCreated が新たに呼び出されると確信しています。

FragmentCatalogで試すことができると思います:

そして、次の行を変更します。

fragmentTransaction.replace(R.id.fragment_container, fcAllStone);

に:

fragmentTransaction.replace(R.id.fragment_container, fcAllStone, "fragment_stone");

CentralPanelFragmentで:

    if (savedInstanceState != null) 
    {
        Log.d(MainActivity.tag, "CenterPanelFragment not null");

        fragmentCatalog = (FragmentCatalog)getFragmentManager().getFragment(savedInstanceState, FragmentCatalog.class.getName());

        // see if stone is open
        if (savedInstanceState != null) {
            FragmentCatalogStone fragmentStone = (FragmentCatalogStone) getFragmentManager()
                    .findFragmentByTag("fragment_stone");
        if (FragmentCatalogStone != null) {
            /*
             * maybe recommit it, dont actually think anything is needed 
             * since moving the below code inside the else statement
             * prevents it from overwriting the FragmentCatalogStone
             */
        }                  
    }
    else
    {
        Log.d(MainActivity.tag, "CenterPanelFragment null");

        fragmentCatalog = new FragmentCatalog();

         android.support.v4.app.FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
         fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

         fragmentTransaction.replace(R.id.fragment_container, fragmentCatalog);
         fragmentTransaction.addToBackStack("FragmentCatalog");
         fragmentTransaction.commit();
    }
于 2013-09-23T20:18:46.167 に答える