1

Navigation Drawerは5つのアイテムを持っています。Fragmentユーザーがアイテムを選択すると、それぞれにロードされFrameLayout ます。今、ユーザーが引き出してNavigation Drawer前と同じアイテムを選択した場合、同じものFragmentを再度ロードするべきではないため、選択した位置を保存し、以前に選択した位置が現在と等しい場合次のように閉じてNavigation Drawerいます。

    String title = null;
    invalidateOptionsMenu();
    android.support.v4.app.Fragment fragment = null;
    if (position == getPrevSelectedItem()) {
        // Already selected fragment is being displayed
    } else {
        switch (position) {
            case Numerics.ZERO:
                fragment = new DashBoardFragment();
                title = fragment.getClass().getSimpleName();
                break;
            case Numerics.ONE:
                break;
            case Numerics.TWO:
                break;
            case Numerics.THREE:
                break;
            case Numerics.FOUR:
                break;
            default:
                break;
        }
        if (fragment != null) {
            showFragment(fragment, title);
        }
        setSelectedItem(position);
    }

次のように、前のフラグメントに戻るナビゲーションを提供するために、に追加してフラグメントを追加してbackstackいます。

    if (fragment != null) {
        String backStateName = fragment.getClass().getName();
        mFragmentManager = getSupportFragmentManager();
        mFragmentTransaction = mFragmentManager.beginTransaction();
        mFragmentTransaction.replace(R.id.dashboard_container, fragment);
        mFragmentTransaction.addToBackStack(backStateName);
        mFragmentTransaction.commit();
    }

問題は 、アイテム番号:3 を選択してからアイテム:4 を選択した場合、前の選択がまだ 4 であるのに、アイテム番号:3 で表示Fragmentされていることです。したがって、アイテム番号: 3 をロードから再度選択するとNavigation DrawerFragment再びロードされます。これを解決する方法は??

編集:

public int getPrevSelectedItem() {
    return selectedItem;
}

public void setSelectedItem(int selectedItem) {
    this.selectedItem = selectedItem;
}
4

4 に答える 4

0

記載の必要は無いelseelse、クロージングのみで良いと思いますdrawer

public int prevPosition=-1;    

if (getPrevSelectedItem() != prevPosition) {
        // Already selected fragment is being displayed
        prevPosition =getPrevSelectedItem();  
        callFragment(position);
 } 
private void callFragment(int position) {
    // TODO Auto-generated method stub
    switch (position) {
    case Numerics.ZERO:
        fragment = new DashBoardFragment();
        title = fragment.getClass().getSimpleName();
        break;
    case Numerics.ONE:
        break;
    case Numerics.TWO:
        break;
    case Numerics.THREE:
        break;
    case Numerics.FOUR:
        break;
    default:
        break;
    }
    if (fragment != null) {
        showFragment(fragment, title);
    }
    setSelectedItem(position);

}
于 2015-12-15T09:18:41.250 に答える
-1

私のコメントから:

drawerを押しても は更新されません。そのため、ポップされた に従って を更新するコードをにback追加する必要があります。onBackPressed()activitypositionBackstackEntry

@Override
public void onBackPressed(){

    String backStackEntryName = fragmentManager.getBackStackEntryAt(backCount - 2).getName(); 
     int id =  R.id.my_main_frag; //default option
     if (MyMainFrag.class.getName().equals(backStackEntryName)){
         id =  R.id.my_main_frag;
         selectedItem = 0;
     } else if (MySecondFrag.class.getName().equals(backStackEntryName)){
         id = R.id.my_second_frag;
         selectedItem = 1;
     }
      ...

     navigation.setCheckedItem(id);
     super.onBackPressed();
}
于 2015-12-15T11:17:26.917 に答える