如何实现android工具栏后退按钮

我正在使用自定义工具栏。 我需要添加回按钮。 现在我使用此代码添加后退按钮。

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); toolbar.setBackgroundColor(getResources().getColor(R.color.white)); toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.back_arrow)); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); 

这很好用。 我可以看到添加了后退按钮。 但请考虑我在Fragment1中没有后退按钮的情况。 现在我转到Fragment2,然后添加Back Button。 从片段2我打开片段3然后我再次添加后退按钮。

现在,当我按下fragment3中的后退按钮返回到fragment2时,我必须检查片段堆栈以查看片段2中是否需要后退按钮。

当我们将片段推送到堆栈时,还有其他方法可以自动处理后退按钮吗?

您可以非常轻松地处理后退图标。 如果你的所有片段都在单个Activity中,我真的建议用以下方式处理它:

首先创建一个抽象的BaseFragment类,它实现了FragmentManager .OnBackStackChangedListener然后在其中放入以下方法:

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mainActivity = (MainActivity) getActivity(); getFragmentManager().addOnBackStackChangedListener(this); shouldDisplayHomeUp(); } @Override public void onBackStackChanged() { shouldDisplayHomeUp(); } public boolean shouldDisplayHomeUp() { //Enable Up button only if there are entries in the back stack boolean canBack = false; try { canBack = getFragmentManager().getBackStackEntryCount() > 0; } catch (Exception ex) { // Log.e(getClass().getCanonicalName(), ex.getMessage());getMessage } if (canBack) { mainActivity.drawerDisable(); } else { mainActivity.drawerEnable(); } return canBack; } 

通过这种方式, disableDrawerenableDrawer函数可以处理你的Icon和OnBackPressed方法,当你需要时按后退图标显示时,你可以在你的活动中处理你的BackStack。 你的onBackPressed应该是这样的:

  int backStackCount = getSupportFragmentManager().getBackStackEntryCount(); if (backStackCount == 0) { //nothing exist in backStack OS handle it super.onBackPressed(); } else { getSupportFragmentManager().popBackStack(); } 

请参阅此处的完整实施

只需添加两行新代码即可。 像这样的东西

 Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar); toolbar.setBackgroundColor(getResources().getColor(R.color.white)); toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.back_arrow)); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); 

这假设您使用的是AppCompatActivity

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); toolbar = (Toolbar) findViewById(R.id.tool_bar); // Attaching the layout to the toolbar object setSupportActionBar(toolbar); // enabling action bar app icon and behaving it as toggle button getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); } 

然后在onOptionsItemSelected中,您可以覆盖主页按钮,如下所示:

  @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } else if(id == android.R.id.home){ Intent i= new Intent(this, MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); finish(); return true; } return super.onOptionsItemSelected(item); } 

在类中使用Method您的Activity

 private void setupToolbar(){ Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar); setSupportActionBar(toolbar); ActionBar actionBar=getSupportActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayShowHomeEnabled(true); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); } 

它适用于工具栏的后退function

 private setUpToolBar() { Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); }