安卓汉堡菜单和返回箭头

3
我想在我的MainActivity页面为用户添加导航功能,包括汉堡菜单和返回箭头。
当我只有一个fragment时,显示汉堡菜单;但如果我在MainActivity中添加了更多的fragment,则显示返回箭头。
如何实现这个功能呢?
以下是我的实现代码...
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个回答

10

创建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();

1
你需要抓住碎片数量变化的时刻,并使用这段代码来隐藏(false)/ 显示(true)DrawerToggle“汉堡包”。
  mDrawerToggle.setDrawerIndicatorEnabled(false);

编辑:

在您的Activity中(某个地方)您可能会有以下代码(用于更改当前Fragment):

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

1
当您在活动中使用导航抽屉时,它可能非常有用。 - Leśniakiewicz
你能否根据我的源代码再详细解释一下...我已经插入了一些代码... - Felipe A.

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

将此代码放入您使用 humbarger 样式导航的活动中,它对我有效。

-1

实际上以上的解决方案都不能完全解决问题。 有几个问题必须考虑 -

a) 如果使用 ActionBarDrawerToggle,那么 getSupportActionBar().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
}

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接