向上导航(操作栏的后退箭头)不适用于碎片

我已经抽屉布局作为我的活动的基本布局,我正在replace这个抽屉布局内存在的框架上的两个片段。 第一个片段不会添加到片段的后端堆栈中。 我在我的活动中显示汉堡包图标(我也想在我的第一个片段中的抽屉菜单)。 在第二个片段中,我通过mActionBarDrawerToggle.setDrawerIndicatorEnabled(false)禁用了汉堡包图标,并使用mActionBarDrawerToggle.setDrawerIndicatorEnabled(false)启用了后退button。

在第一个片段onResume中,我通过mActionBarDrawerToggle.setDrawerIndicatorEnabled(true)启用汉堡包图标,这样当用户从第二个片段中按下返回button(包括硬件和动作栏的向上button)时,用户将返回到第一个片段,并且将启用汉堡包图标。 一切工作正常,只有我不能从第二个片段后退button操作。 我无法点击它。 以下是我的代码: –

活动代码

 if (Utility.isLargeScreen(this)) setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); else setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); mHiddenGemsApplication = (HiddenGemsApplication) getApplication(); super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); initViews(); setSupportActionBar(mToolbar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayHomeAsUpEnabled(true); } mTextViewActionBarTitle.setText(getString(R.string.app_name)); mActionBarDrawerToggle = new ActionBarDrawerToggle(HomeActivity.this, mDrawerLayout, mToolbar, R.string.open_drawer, R.string.close_drawer) { @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); } }; mDrawerLayout.setDrawerListener(mActionBarDrawerToggle); mActionBarDrawerToggle.syncState(); mFragmentManager = getSupportFragmentManager(); replaceFragment(new CategoryFragment(), getString(R.string.app_name), CategoryFragment.TAG); @Override public void onBackPressed() { if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { mDrawerLayout.closeDrawers(); return; } super.onBackPressed(); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: if (mFragmentManager.getBackStackEntryCount() > 0) { mFragmentManager.popBackStack(); } return true; default: return super.onOptionsItemSelected(item); } } public void replaceFragment(Fragment fragment, String actionBarTitle, String tag) { if (mFragmentManager == null) return; FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.content_frame, fragment, tag); if (!tag.equals(CategoryFragment.TAG)) fragmentTransaction.addToBackStack(tag); fragmentTransaction.commit(); setActionBarTitle(actionBarTitle); } public void setActionBarTitle(String actionBarTitle) { if (!TextUtils.isEmpty(actionBarTitle)) mTextViewActionBarTitle.setText(actionBarTitle); } public void setDrawerIndicatorEnabled(boolean value) { if (mActionBarDrawerToggle != null) { mActionBarDrawerToggle.setDrawerIndicatorEnabled(value); } } 

活动XML

 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="nirvaniclabs.com.hiddengems.activities.HomeActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <include android:id="@+id/toolbarlayout" layout="@layout/toolbar_layout" /> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/toolbarlayout" /> </RelativeLayout> <android.support.design.widget.NavigationView android:id="@+id/navigation" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:menu="@menu/navigation_items" /> </android.support.v4.widget.DrawerLayout> 

第一个片段: –

  private Button mButtonTemp; private AppCompatActivity mActivity; public static String TAG = "CategoryFragment"; public CategoryFragment() { // Required empty public constructor } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof Activity) mActivity = (AppCompatActivity) context; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View viewGroup = inflater.inflate(R.layout.fragment_category, container, false); initViews(viewGroup); mButtonTemp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ((HomeActivity) mActivity).replaceFragment(new TripListFragment(), "Trip Fragment", TripListFragment.TAG); } }); return viewGroup; } private void initViews(View viewGroup) { mButtonTemp = (Button) viewGroup.findViewById(R.id.btn_temp); } @Override public void onResume() { super.onResume(); ((HomeActivity) mActivity).setDrawerIndicatorEnabled(true); ((HomeActivity) mActivity).setActionBarTitle(getString(R.string.app_name)); } 

第二个片段

  private AppCompatActivity mActivity; public static String TAG = "TripListFragment"; public TripListFragment() { // Required empty public constructor } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof Activity) mActivity = (AppCompatActivity) context; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); ActionBar actionBar = mActivity.getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayHomeAsUpEnabled(true); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_trip_list, container, false); } @Override public void onResume() { super.onResume(); ((HomeActivity) mActivity).setDrawerIndicatorEnabled(false); } 

另外,当我在第二个片段时,我可以轻扫并查看抽屉菜单。 我不希望这种行为,抽屉菜单应该只在片段1中打开。

如果在我的代码中有任何错误,请告诉我。

Solutions Collecting From Web of "向上导航(操作栏的后退箭头)不适用于碎片"

终于得到了答案。 在我的情况下,我通过mActionBarDrawerToggle.setDrawerIndicatorEnabled(false);禁用抽屉指示器mActionBarDrawerToggle.setDrawerIndicatorEnabled(false); 并由于此导航图标点击被禁用。 要启用此function,我必须将ToolbarNavigationClickListener添加到ActionBarDrawerToggle ,该function将启用导航图标点击。

以下是我的工作代码:

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

请参阅此链接以获得更多的说明

在经历了同样的问题之后,我最终设法得到了上面的button,使用这个代码片段。 您必须在onCreate()或onCreateView()中设置setHasOptionsMenu

 setHasOptionsMenu(true); 

然后,在onOptionsItemSelected()添加这个检查向上/ homebutton被按到你的switch()[或if …]语句:

 @Override public boolean onOptionsItemSelected(MenuItem item) { xL(); switch (item.getItemId()) { case android.R.id.home : getActivity().onBackPressed(); break; case R.id.mn_exit : exitFragment(); break; default : break; } return super.onOptionsItemSelected(item); }