簡體   English   中英

Android漢堡菜單和后退箭頭

[英]Android Hamburger Menu and Back Arrow

我想在我的MainActivity上為用戶提供帶有漢堡包和后退箭頭的屬性導航。

當我只有一個片段集漢堡包,但是如果我在MainActivity上添加了更多片段時,請設置后退箭頭。

我該如何實施?

這是我的實現...

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

private Toolbar toolbar;
private DrawerLayout drawer;
private NavigationView navigationView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    setSupportActionBar(toolbar);

    final ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    navigationView.setNavigationItemSelectedListener(this);

    //TODO: Insert back arrow button if have more than one fragment on backstack
    /*getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            int stackHeight = getSupportFragmentManager().getBackStackEntryCount();
            if (stackHeight > 0) {
                if (getSupportActionBar() != null) {
                    getSupportActionBar().setHomeButtonEnabled(true);
                    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                    toggle.setDrawerIndicatorEnabled(false);
                }
            } else {
                if (getSupportActionBar() != null) {
                    getSupportActionBar().setDisplayHomeAsUpEnabled(false);
                    toggle.setDrawerIndicatorEnabled(true);
                }
            }
        }
    });*/

    ActivityUtils.addFragmentToActivity(getSupportFragmentManager(), new ListVeiculoFragment(), R.id.container_main);
}
}

通過創建Interface類來工作:

public interface HideShowIconInterface{
    void showHamburgerIcon();
    void showBackIcon();
}

在您的Activity實施Interface

public class YourActivity extends AppCompatActivity implements HideShowIconInterface{
    @Override
    public void showHamburgerIcon() {
       getSupportActionBar().setDisplayHomeAsUpEnabled(false);
       mActionBarDrawerToggle.setDrawerIndicatorEnabled(true);
    }
    @Override
    public void showBackIcon() {
      mActionBarDrawerToggle.setDrawerIndicatorEnabled(false);
      getSupportActionBar().setDisplayHomeAsUpEnabled(true);   
   }
}

在您的Fragment ,通過以下方式調用您想要的任何內容:

((HideShowIconInterface) getActivity()).showHamburgerIcon();

要么

((HideShowIconInterface) getActivity()).showBackIcon();

您必須抓住片段數發生變化的時刻,並使用此代碼隱藏(false)/顯示(true)DrawerToggle“ Hamburger”

  mDrawerToggle.setDrawerIndicatorEnabled(false);

編輯:

在您的活動(某處)中,您會有類似的內容(在其中更改當前片段):

private void selectItem(int position) {

Fragment fragment = new MyFragment();

FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
               .replace(R.id.content_frame, fragment)
               .commit();
}

我將以此更改最后一行:

fragmentManager.beginTransaction()
               .replace(R.id.content_frame, fragment)
               .addToBackStack(null)
               .commit();

然后檢查:

  if(fragmentManager.getBackStackEntryCount() > 1) mDrawerToggle.setDrawerIndicatorEnabled(false);
 setSupportActionBar(toolbar);
    toolbar.setTitle(R.string.app_name);
    toolbar.setTitleTextColor(getResources().getColor(R.color.colorWhite));
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

將此代碼放到您的活動中,在其中使用humbarger樣式導航對我有用。

實際上,以上解決方案均無法完全發揮作用。 有幾個問題需要考慮-

a)如果使用ActionBarDrawerTogglegetSupportActionBar().setDisplayHomeAsUpEnabled現在可以按預期工作了-它實際上替換了切換圖標,但是單擊仍由切換處理,並且再次啟用切換時,漢堡圖標被隱藏

b)由於片段事務(添加,從后堆棧還原表單)是異步完成的,因此在片段事務完成后必須檢查實際的后堆棧大小-例如,從片段onCreateView

這是對我有用的代碼(在Kotlin中):

 override fun onCreate(savedInstanceState: Bundle?) {
    // ....
    drawerToggle  = ActionBarDrawerToggle(
            this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close)
    drawer_layout.addDrawerListener(drawerToggle)
    drawerToggle.setHomeAsUpIndicator(R.drawable.ic_arrow_back_white)
    drawerToggle.syncState()
    drawerToggle.setToolbarNavigationClickListener {
        // whatever action is needed on homeAsUp click
        onBackPressed()
}

//And this method should be called from fragment's onCreateView
fun showUpNavigation() {
    drawerToggle.isDrawerIndicatorEnabled=supportFragmentManager.getBackStackEntryCount() <= 1
}

您只需添加

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

有關更多詳細信息,請參見Android-將ActionBar后退按鈕切換到導航按鈕

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM