Android汉堡菜单和后退箭头

时间:2017-01-09 11:34:00

标签: android android-toolbar android-navigation-drawer android-navigation

我想在我的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);
}
}

5 个答案:

答案 0 :(得分:6)

通过创建Interface类:

来工作
public interface HideShowIconInterface{
    void showHamburgerIcon();
    void showBackIcon();
}

Interface

中实施Activity
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();

答案 1 :(得分:1)

你必须抓住片段数量变化的时刻,并使用此代码隐藏(false)/ show(true)DrawerToggle“Hamburger”

  mDrawerToggle.setDrawerIndicatorEnabled(false);

编辑:

在你的Activity(某个地方)你有类似的东西(你改变当前的片段):

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);

答案 2 :(得分:0)

 setSupportActionBar(toolbar);
    toolbar.setTitle(R.string.app_name);
    toolbar.setTitleTextColor(getResources().getColor(R.color.colorWhite));
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

将此代码放入您使用humbarger样式导航的活动中。

答案 3 :(得分:0)

实际上,以上解决方案均无法完全发挥作用。 有几个问题需要考虑 -

a)如果使用ActionBarDrawerToggle,那么getSupportActionBar().setDisplayHomeAsUpEnabled现在正在按预期工作 - 它实际上取代了切换图标,但是当切换再次启用时,仍会通过切换加上汉堡包图标来隐藏点击次数

b)由于片段事务(add,restore form backstack)是异步完成的,因此必须在片段事务完成后检查实际的backstack大小 - 例如来自片段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
}

答案 4 :(得分:-2)

您只需添加

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

有关详细信息,请参阅Android - Switch ActionBar Back Button to Navigation Button