工具栏后退按钮不关闭当前片段

Toolbar back button does not close current Fragment

我有一个 activity 在创建时加载片段。我在那个 activity 上有一个工具栏,它有一个按钮,单击该按钮会在第一个创建的片段之上添加一个新片段。

现在在该工具栏上,单击时,我想删除较新的片段,这样它就可以取代底部的片段(较旧的片段)。我已经搜索过了,除了一件事我有点想通了。

我这样做是为了查看是否按下了工具栏按钮:

@Override
    public boolean onKeyUp(int keyCode, KeyEvent objEvent) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            onBackPressed();
            return true;
        }
        return super.onKeyUp(keyCode, objEvent);
    }


 @Override
    public void onBackPressed() {
        FragmentManager mFM = getSupportFragmentManager();
        if(mFM.findFragmentByTag("NewFragment") != null){
            mFM.beginTransaction().remove(mFM.findFragmentByTag("NewFragment")).commit();
        }
    }

问题是,当您单击 "hardware's back button" 而不是工具栏的后退按钮时,"keyCode" 仅等于 KEYCODE_BACK。它给我的是键码 58 而不是 4 (KEYCODE_BACK)。

从您的问题中不清楚您是在询问片段管理问题(FragmentTransaction 删除与替换)还是工具栏按钮问题。我假设后者...

Android 工具栏或操作栏应使用以下方式处理操作:

@Override
public Boolean onOptionsItemSelected(MenuItem item)
{
 switch (item.getItemId())
 {
  case MY_BACK_BUTTON:
    myBackPressedHandler();
    return (true);
 }
 return (false);
}

这假定您的“后退”按钮已添加为 MenuItem,并被赋予了 MY_BACK_BUTTON 的 ID。

对于工具栏,您可以使用 MenuItemClickListener 来处理点击事件:

mToolbar.setOnMenuItemClickListener(MenuItem menuItem)
{
 @Override
 public Boolean onMenuItemClick(MenuItem menuItem)
 {
  // call onOptionsItemSelected, or handle the click here directly
  return (thisFragment.onOptionsItemSelected(menuItem));
 }
});

如果您指的是 Toolbar/ActionBar 上的 "Up" 按钮,即 setDisplayHomeAsUpEnabled(true),这将有一个 android.R.id.home 的 getItemId() 并且可以在相似时尚:

case android.R.id.home:
  myBackPressedHandler();
  return (true);

我相信您正在寻找 Toolbar 小部件的 NavigationListener

mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed();
        }
    });

但是如果您使用带有 ActionBar 的主题并设置 supportActionBar,那么请执行以下操作:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case android.R.id.home:
            onBackPressed();
            break;
    }
    return true;
}