4

我現在正在用這個撓我的腦袋....我有一個ActionBarActivity加載一個初始Fragment - 原始菜單在活動內膨脹。現在,我有一個導航欄,當選擇一個項目時,加載一個不同的片段並將其添加到後臺堆棧中。與片段/工具欄返回導航

當我做到這一點,有一對夫婦的事情,我想設置:

  1. 將家裏高達指標
  2. 從主要活動
  3. 設置有選項無效選項菜單真實的片段
  4. 確保了指標正確導航回原來的片段

Someth比較奇怪的是正在進行 - 向上指示符只出現一次,並不像後退按鈕一樣,儘管我已經使新菜單失效並使其充滿,但新菜單將附加到到原始活動菜單。

編輯:好的我解決了附加問題 - 忘記在onCreateOptionsMenu方法中添加menu.clear()

我的抽屜式導航欄佈局有onClick方法,所有菜單項可能會觸發另一片段的負載:

public void navItemClick(View view) { 

     switch (view.getId()) { 
      case R.id.ripSMS: 
       mNavigationDrawer.toggleHome(false); 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
       FragmentTransaction mTrans = getSupportFragmentManager().beginTransaction(); 
       mTrans.replace(R.id.voiceover_frame_layout,new MessageFragment(),"main_ui") 
         .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).addToBackStack("msg").commit(); 
       break; 
      case R.id.ripEmail: 
       break; 
      case R.id.ripSettings: 
       break; 
     } 

     mNavigationDrawer.closeDrawer(); 
    } 

toggleHome:

public void toggleHome(boolean show) { 
     mDrawerToggle.setDrawerIndicatorEnabled(show); 

     if (!show) { 
      mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
     } else { 
      mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); 
     } 
    } 

一旦項目被觸發onCreate含有無效和hasOptions代碼:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getActivity().invalidateOptionsMenu(); 
    setHasOptionsMenu(true); 
} 

onCreateOptionsMenu然後膨脹另一個菜單佈局(包含一個稱爲設置的單個項目)。

如上所述,這只是部分工作一次 - 我第一次使用該項目來加載片段,我得到後面的圖標,但它也不工作(這是設置在onOptionsItemSelected檢查家庭項目按 - 它什麼也沒做)。當我按下後退按鈕時,它將我帶回正確的位置。但是,如果我導航回來,即使代碼運行通過onCreate,現在更長的後退箭頭也會顯示!

回答

11

好吧,所以我設法解決這個經過一些試驗和錯誤。兩個更改時間:

  1. 實施addOnBackStackChangedListener
  2. ActionBarDrawerToggle'ssetToolbarNavigationClickListener需要設置

正如我只有一個活動(其他的一切都是碎片班),我增加了堆棧中監聽到父活動的onCreate方法:

getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
      } else { 
       getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
      } 
     } 
    }); 

這解決了消失後退箭頭goi回到片段。最後添加偵聽到我的NavigationDrawer的設置類:

mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       getActivity().onBackPressed(); 
      } 
     }); 

我想我就是一切向尖使用onOptionsItemSelectedandroid.R.id.home但從來沒有爲我的唯一問題。這可能是我實施事情的方式,但如果有人看到任何明顯的事情,爲什麼請讓我知道!

2

這些步驟可幫助您在加載片段時顯示工具欄中的按鈕。點擊時彈出。

setNavigationOnClickListener設置爲您活動中的工具欄。

final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 

    toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(getSupportFragmentManager().getBackStackEntryCount() > 0){ 
       getSupportFragmentManager().popBackStack(); 
      }else { 
       drawer.openDrawer(GravityCompat.START); 
      } 
     } 
    }); 

在您的活動中執行FragmentManager.OnBackStackChangedListener活動。並與SupportFragmentManagerOnCreate()

getSupportFragmentManager().addOnBackStackChangedListener(this); 

OnBackStackChangedListener實現方法進行註冊:

@Override 
public void onBackStackChanged() { 
    if(getSupportFragmentManager().getBackStackEntryCount() > 0){ 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    }else { 
     getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
     toggle.syncState(); 
    } 
} 
+0

這只是其中很多的奮鬥之後爲我工作的解決方案。感謝分享! 調用'toggle.syncState();'是一個關鍵因素,否則漢堡菜單一旦返回就不可見。 – 2017-03-30 22:50:58

1

對我來說,上述回答是不夠的,但我用@ Hamz4h_和挖掘到ActionBarDrawerToggle後,更增添了幾分類。我打電話我的這個方法從活動的onCreate:

private void initNavigationElements() { 
    final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, mBinding.drawerLayout, mBinding.appBarMain.toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    mBinding.drawerLayout.addDrawerListener(toggle); 

    // Tricking the toggle by giving it its own arrow as a custom indicator. 
    // It will use it when setDrawerIndicatorEnabled is called with false 
    toggle.setHomeAsUpIndicator(toggle.getDrawerArrowDrawable()); 
    toggle.syncState(); 

    getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      DrawerArrowDrawable drawerArrowDrawable = toggle.getDrawerArrowDrawable(); 
      if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
       // 1 - Display as arrow 
       drawerArrowDrawable.setProgress(1); 
       toggle.setDrawerIndicatorEnabled(false); 

      } else { 
       // 2 - Display as arrow menu 
       drawerArrowDrawable.setProgress(0); 
       toggle.setDrawerIndicatorEnabled(true); 
      } 
     } 
    }); 

    toggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      // This is called only when setDrawerIndicatorEnabled is set as false, meaning we are not at the "root" fragment. 
      getSupportFragmentManager().popBackStackImmediate(); 
     } 
    }); 
} 

希望這會幫助別人:)