Android 安卓汉堡包菜单和后箭头

Android 安卓汉堡包菜单和后箭头,android,android-toolbar,navigation-drawer,android-navigation,Android,Android Toolbar,Navigation Drawer,Android Navigation,我想在我的MainActivity上为我的用户制作一个带有汉堡包和后箭头的属性导航 当我只有一个碎片集汉堡包,但如果我在我的主要活动中添加了更多碎片,请设置后退箭头 我如何实现这一点 这是我的实现 public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { private Toolbar toolbar; private

我想在我的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);
}
}
你只要加上

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
有关更多详细信息,请参阅


将此代码放在您的活动中,您可以使用Humbager样式的导航,这对我很有用。

您必须抓住片段数量发生变化的时刻,并使用此代码隐藏(假)/显示(真)抽屉切换“汉堡包”

编辑:

在您的活动(某处)中,您有如下内容(更改当前片段):

最后一行我将改为:

fragmentManager.beginTransaction()
               .replace(R.id.content_frame, fragment)
               .addToBackStack(null)
               .commit();
然后检查:

  if(fragmentManager.getBackStackEntryCount() > 1) mDrawerToggle.setDrawerIndicatorEnabled(false);

通过创建
接口
类来工作:

public interface HideShowIconInterface{
    void showHamburgerIcon();
    void showBackIcon();
}
在您的
活动中实施
接口

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);   
   }
}
片段中
,通过以下方式调用所需内容:

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


事实上,上述解决方案都不能完全奏效。 必须考虑以下几个问题:

a) 如果使用
ActionBarDrawerToggle
,则
getSupportActionBar().setDisplayHomeAsUpEnabled
现在可以按预期工作-它实际上会替换切换图标,但单击仍由切换处理,并且再次启用切换时汉堡图标会隐藏

b) 由于片段事务(添加、恢复表单backstack)是异步完成的,因此必须在片段事务完成后检查实际的backstack大小-例如,从片段
onCreateView

以下是适用于我的代码(在Kotlin中):

override-fun-onCreate(savedInstanceState:Bundle?){
// ....
抽屉切换=ActionBarDrawerToggle(
这,抽屉布局,工具栏,R.string.navigation\u抽屉打开,R.string.navigation\u抽屉关闭)
抽屉布局。添加抽屉链接器(抽屉切换)
抽屉切换。设置HomeAsupIndicator(右侧可绘制。ic箭头\背面\白色)
drawerToggle.syncState()
抽屉切换。设置工具栏导航单击侦听器{
//在homeAsUp上需要执行的任何操作单击
onBackPressed()
}
//应该从fragment的onCreateView调用此方法
乐趣展示导航(){

drawerToggle.IsDrawerindIndicatorEnabled=supportFragmentManager.GetBackbackEntryCount()当您在活动中使用导航抽屉时,它会很有用。请您根据我的源代码稍微解释一下……我插入了一些代码。。。
public interface HideShowIconInterface{
    void showHamburgerIcon();
    void showBackIcon();
}
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);   
   }
}
((HideShowIconInterface) getActivity()).showHamburgerIcon();
((HideShowIconInterface) getActivity()).showBackIcon();
 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
}