每次用户点击抽屉菜单中的项目时,我都会使用DrawerLayout
并添加新的Fragment
。这非常有效。
在其中一个fragments
中,用户可以导航到另一个片段:
private void loadArchives() {
PUCNewsArchive news_archive = new PUCNewsArchive();
getFragmentManager()
.beginTransaction()
.add(R.id.container_frame, news_archive, "news_archives")
.addToBackStack(null)
.commit();
}
这将正确地将另一个fragment
添加到堆栈中。但是,它不会将操作栏抽屉按钮/图标更改为后退按钮。因此,在点击时再次打开抽屉,这是不应该做的。导航回来的唯一方法是使用硬件后退按钮,它返回到之前的fragment
。我尝试将以下内容添加到我的主Activity
以查看发生了什么:
@Override
public void onBackPressed(){
FragmentManager fm = getFragmentManager();
if (fm.getBackStackEntryCount() > 0) {
Log.i("MainActivity", "popping backstack");
fm.popBackStack();
} else {
Log.i("MainActivity", "nothing on backstack, calling super");
super.onBackPressed();
}
}
但是只有在我使用硬件后退按钮时才会调用它,因为抽屉按钮只打开抽屉。
我认为这应该检查它是否应该打开抽屉或导航:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
switch(item.getItemId()) {
case android.R.id.home:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
我错过了什么?为什么抽屉按钮永远不会改变为后退按钮,也不像一个按钮?
答案 0 :(得分:2)
您无需使用onBackPressed()
。
我的应用中有一个非常similar situation。以下是我如何使用它:
我在主要活动中创建了一个方法:
public void foo(int fragment_id) {
if(fragment_id == some_id){
// keep the drawer carat
mDrawerToggle.setDrawerIndicatorEnabled(true);
}else{
// Disable the drawer carat, and enable the back button
mDrawerToggle.setDrawerIndicatorEnabled(false);
getActionBar().setDisplayHomeAsUpEnabled(true);
}
}
我从每个片段的onResume()
调用此方法,并将其传递给特定的片段id。或者,您可以从主要活动中的loadFragment()/loadArchives()
方法调用它。这对我来说很好。
答案 1 :(得分:0)
在导航活动中
此活动控制应用中的所有片段。
在准备新片段以替换其他片段时,我设置了DrawerToggle
setDrawerIndicatorEnabled(false)
喜欢这样:
private void loadArchives() {
PUCNewsArchive news_archive = new PUCNewsArchive();
//disable the toggle menu and show up carat
theDrawerToggle.setDrawerIndicatorEnabled(false);
getFragmentManager()
.beginTransaction()
.add(R.id.container_frame, news_archive, "news_archives")
.addToBackStack(null)
.commit();
}
在onCreateview中的另一个片段
呼叫
// update the actionbar to show the up carat/affordance
getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
答案 2 :(得分:0)
我尝试了以上建议的代码但是操作栏左侧的“向上”或“向后”箭头没有显示在我的应用中。但幸运的是,我能够解决这个问题。
简要代码:
将当前片段放入Back Stack时启动片段的函数:
Visual3D
打开或关闭“NavigationDrawer”的功能:
public void startFragment(){
MyFrag myFrag = new MyFrag();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.frag_container ,myFrag)
.addToBackStack(null)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.commit();
}
我从Material.io下载了drawable:ic_keyboard_backspace_white_24dp
完整答案:
Disabling navigation drawer, toggling home-button/up-indicator in fragments