0

初めまして、こちらをご覧いただきありがとうございます。私は4つのフラグメントを持っています。1 つは、メニューを表示する Menu Fragment です。データと画像のリストを表示する 2 つのリスト フラグメントがあります。4 番目のフラグメントは詳細フラグメントです。すべてが正常に始まります。

設定:

表示されるリスト ボタンをクリックすると、メニュー フラグがその後ろに隠れます。

リスト フラグメントのエントリをクリックすると、インターフェイスを使用してデータが渡され、詳細フラグメントが表示されます。

リストフラグメントに移動したら、戻るボタンをクリックします。

戻るボタンをもう一度クリックすると、メニューフラグが表示されます。

問題:

リスト ボタンをもう一度クリックすると、リストが表示されますが、メニュー フラグメントはまだその後ろに表示されています。

バックスタックと関係があると思いますが、正しく使用していない可能性があります。どんな助けでも大歓迎です。誰かがこの問題を説明できれば、それは素晴らしいことです。コンデの一部を投稿してほしい場合はお知らせください。しかし、私の問題はバックスタックにあるように感じます。これは、バックスタックを台無しにしたコードの一部です。

private Fragment visible;
private Fragment mVisibleCached;
@Override
public void onBackPressed() {
    super.onBackPressed();
    visible = mVisibleCached;

}

. .

public void showFragment(int fragIn) {
    final FragmentManager fm = getSupportFragmentManager();
    final FragmentTransaction ft = fm.beginTransaction();
    ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
    if (visible != null) {
        ft.hide(visible);
        //ft.remove(visible);
        mVisibleCached = visible;
        ft.addToBackStack(null);

    }
    switch (fragIn) {
    case 0:
        menuFrag = ((MenuFragment) fm.findFragmentByTag(MenuFragment.TAG));
        if (menuFrag == null) {
            menuFrag = MenuFragment.newInstance();
            ft.add(R.id.fragment_container, menuFrag, MenuFragment.TAG);
        } else {
            // ft.show(menuFrag);
            //ft.add(R.id.fragment_container, menuFrag, MenuFragment.TAG);
            if (!menuFrag.isVisible()) {
                ft.show(menuFrag);
            }
        }

        ft.addToBackStack(null);
        visible = menuFrag;
        break;
    case 1:
        programsFrag = ((ListFrag) fm.findFragmentByTag(PROGRAMS_TAG));
        if (programsFrag == null) {
            programsFrag = ListFrag.newInstance(false);
            ft.add(R.id.fragment_container, programsFrag, PROGRAMS_TAG);
        } else {
            // ft.show(programsFrag);
            //ft.add(R.id.fragment_container, programsFrag, PROGRAMS_TAG);

            // ft.replace(R.id.fragment_container, programsFrag);
            if (!programsFrag.isVisible()) {
                ft.show(programsFrag);
            }
        }
        ft.addToBackStack(null);
        visible = programsFrag;
        break;
    case 2:
        hostsFrag = ((ListFrag) fm.findFragmentByTag(HOSTS_TAG));
        if (hostsFrag == null) {
            hostsFrag = ListFrag.newInstance(true);
            ft.add(R.id.fragment_container, hostsFrag, HOSTS_TAG);
        } else {
            // ft.show(hostsFrag);
            //ft.add(R.id.fragment_container, hostsFrag, HOSTS_TAG);

            // ft.replace(R.id.fragment_container, hostsFrag);
            if (!hostsFrag.isVisible()) {
                ft.show(hostsFrag);
            }
        }
        ft.addToBackStack(null);
        visible = hostsFrag;
        break;
    case 3:
        detailsFrag = ((DetailsFrag) fm.findFragmentByTag(DetailsFrag.TAG));
        if (detailsFrag == null) {
            detailsFrag = DetailsFrag.newInstance();
            ft.add(R.id.fragment_container, detailsFrag, DetailsFrag.TAG);
        } else {
            //ft.add(R.id.fragment_container, detailsFrag, DetailsFrag.TAG);
            if (!detailsFrag.isVisible()) {
                ft.show(detailsFrag);
            }
        }
        ft.addToBackStack(null);
        visible = detailsFrag;
        break;
    }
    ft.commit();
}
4

1 に答える 1

1

私はあなたの方法に従って問題を解決しました.それはエレガントではありませんが、私にとってはうまくいきます..

あなたの2つのフラグメントの代わりに、整数varと整数の配列リストを使用しました(整数はフラグメントのIDです)

int visible;

ArrayList<Integer> cachedVisible= new ArrayList<Integer>();

次に、正しいフラグメントを示すメソッドで、私はこのようなことをしました

private void setVisibleFragment(int id) {
if(visible!=0){
        cachedVisible.add(visible);
    }else{
        cachedVisible.add(R.id.home);
    }


   switch (id) {
        case R.id.settings:
        visible=R.id.settings;
        break;
    case R.id.services:
        ft.hide(fm.findFragmentById(R.id.settings_frag));
        ft.hide(fm.findFragmentById(R.id.plugin_frag));
        ft.show(fm.findFragmentById(R.id.service_frag));
        ft.addToBackStack(null);
        ft.commitAllowingStateLoss();
        visible=R.id.services;
        break;
        ....
   }
}

そして最後に FragmentActivity

public void onBackPressed() {
    if(cachedVisible.size()==0){
        finish();
    }else{
    visible = cachedVisible.get(cachedVisible.size()-1);
    cachedVisible.remove(cachedVisible.size()-1);
     }
    setVisibleFragment(visible);
    cachedVisible.remove(cachedVisible.size()-1);   
}

それが誰かを助けることを願っています;)

于 2013-05-15T23:07:25.003 に答える