【问题标题】:ActionBarDrawerToggle with AppCompatActivity and Toolbar Back button with Fragments带有 AppCompatActivity 的 ActionBarDrawerToggle 和带有片段的工具栏后退按钮
【发布时间】:2016-05-05 07:54:17
【问题描述】:

我正在使用带有 NavigationView 的 ActionBarDrawerToggle。我的内容使用片段显示。

我正在关注this stackoverflow question 让按下后退按钮工作,但控制永远不会流向onOptionsItemSelected

这是我的 MainActivity.class:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes);
    mDrawerLayout.addDrawerListener(mDrawerToggle);
    mDrawerToggle.syncState();

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() == 0) {
        super.onBackPressed();
    } else {
        removeFragmentFromBackstack();
        updateToolbarWithHomeButton();
    }

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    switch (item.getItemId()) {
        case android.R.id.home:
            // doesn't reach here ever.
            return true;
        case R.id.action_x:
            // do something
            return true;
        case R.id.action_y:
            // do something
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    mDrawerToggle.onConfigurationChanged(newConfig);
}

private void updateToolbarWithBackButton() {
    ActionBar actionBar = getSupportActionBar();
    if (null != mDrawerToggle && null != actionBar) {
        mDrawerToggle.setDrawerIndicatorEnabled(false);
        actionBar.setDisplayHomeAsUpEnabled(true);
    }
}

private void updateToolbarWithHomeButton() {
    ActionBar actionBar = getSupportActionBar();
    if (null != mDrawerToggle && null != actionBar) {
        actionBar.setDisplayHomeAsUpEnabled(false);
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        mDrawerToggle.syncState();
    }
}

如何捕获来自Toolbar 的返回按钮点击?


更新:

感谢@mike,工具栏上的后退箭头按钮现在被捕获在我的 MainActivity 代码中的onOptionsItemSelected 中,如下更新。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes);
    mDrawerLayout.addDrawerListener(mDrawerToggle);
    mDrawerToggle.syncState();

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() == 0) {
        super.onBackPressed();
    } else {
        removeFragmentFromBackstack();
        updateToolbarWithHomeButton();
    }

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            //TODO: skip back press if fragment backstack count is 0.
            onBackPressed();
            updateToolbarWithHomeButton();
            return true;
        case R.id.action_x:
            // do something
            return true;
        case R.id.action_y:
            // do something
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    // Sync the toggle state after onRestoreInstanceState has occurred.
    mDrawerToggle.syncState();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    mDrawerToggle.onConfigurationChanged(newConfig);
}

private void updateToolbarWithBackButton() {
    ActionBar actionBar = getSupportActionBar();
    if (null != mDrawerToggle && null != actionBar) {
        mDrawerToggle.setDrawerIndicatorEnabled(false);
    }
}

private void updateToolbarWithHomeButton() {
    ActionBar actionBar = getSupportActionBar();
    if (null != mDrawerToggle && null != actionBar) {
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        mDrawerToggle.syncState();
    }
}

【问题讨论】:

    标签: android navigation-drawer drawerlayout actionbardrawertoggle drawertoggle


    【解决方案1】:

    如果您希望在单击切换开关时触发onOptionsItemSelected() 方法,请从ActionBarDrawerToggle 构造函数调用中删除toolbar 参数。

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
        R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes);
    

    否则,切换开关会在内部处理打开和关闭抽屉,而无需调用ActionBarDrawerToggle#onOptionsItemSelected()

    如果您想根据当前状态以不同方式处理单击主页Button,您还需要删除在onOptionsItemSelected() 方法顶部返回的if 块。

    而且,您应该只在onCreate() 中调用一次setDisplayHomeAsUpEnabled(true)。你不需要一直打开和关闭它。启用和禁用抽屉指示器会解决这个问题。

    【讨论】:

    • 我从 new ActionBarDrawerToggle(this, mDrawerLayout, R.string.openDrawerContentDescRes, R.string.closeDrawerContentDescRes) 中删除了工具栏;但是 ID 为 android.R.id.home 的 MenuItem 的 switch case 没有通过。后退按钮有不同的 id 吗?
    • MenuItem 的ID 为android.R.id.home 时,对mDrawerToggle.onOptionsItemSelected(item) 的调用返回true,因此if 块在执行到达您的switch 之前返回。您可以将该呼叫转移到您的第一个 case
    • 我在if 块内添加了一条日志语句,但当我单击返回按钮时,它不会为mDrawerToggle.onOptionsItemSelected(item) 返回true
    • 返回按钮到底是什么意思?切换箭头,还是ActionBar 的向上按钮?
    • 感谢@Mike 设置setDisplayHomeAsUpEnabled(true) 一次在onCreate 中以及在ActionBarDrawerToggle 的构造函数中没有toolbar 用于在onOptionsItemSelected 中捕获android.R.id.home
    【解决方案2】:

    删除这一行

     if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
    

    来自onOptionsItemSelected() 所以它看起来像这样

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
    switch (item.getItemId()) {
        case android.R.id.home:
            // doesn't reach here ever.
            return true;
        case R.id.action_x:
            // do something
            return true;
        case R.id.action_y:
            // do something
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-08-05
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多