我有一个活动Toolbar和FrameLayout- 片段容器。片段之间的导航是使用兼容性库 (v7) 中的导航抽屉完成的。
工具栏上有一个汉堡包按钮,单击它会弹出一个 NavigationView - 选择一个片段 - 它会替换主片段 ( Fragment0)。汉堡包按钮替换为向上按钮(向左箭头)。我希望当我们点击它时,我们返回到原始片段,并且当没有汉堡包按钮时侧边栏不会在滑动时爬出。但实际上,Up-button 只改变了它的外观,而没有改变行为——当你点击它时,会弹出一个侧边栏。
这是我的活动代码:
public class MainActivity extends AppCompatActivity {
private String[] mNumberTitles;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private Toolbar toolbar;
private ActionBarDrawerToggle mDrawerToggle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);
if (fragment == null) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction
.add( R.id.fragment_container, new Fragment0())
.commit();
}
mNumberTitles = getResources().getStringArray(R.array.numbers_array);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_list_item, mNumberTitles));
// Set the list's click listener
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
initToolbar();
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
toolbar, R.string.drawer_open, R.string.drawer_close);
// Set the drawer toggle as the DrawerListener
mDrawerLayout.addDrawerListener(mDrawerToggle);
mDrawerToggle.syncState();
// заменяем гамбургер на Up button во второстепенных фрагментах
fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} else {
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
mDrawerToggle.syncState();
}
}
});
}
private void initToolbar() {
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
/** Swaps fragments in the main content view */
private void selectItem(int position) {
Fragment fragment = null;
switch (position) {
case 0 : fragment = new Fragment0();
break;
case 1 : fragment = new Fragment1();
break;
case 2 : fragment = new Fragment2();
break;
default: fragment = new Fragment0();
break;
}
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit();
// Highlight the selected item, update the title, and close the drawer
mDrawerList.setItemChecked(position, true);
setTitle(mNumberTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
private void setTitle(String title) {
if (toolbar != null)
toolbar.setTitle(title);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home: // it's for up button
Log.d("!!!!!!!!!", "HOMe button is pressed");
getSupportFragmentManager().popBackStack();
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
selectItem(position);
}
}
}
按下向上按钮(日志为空)时,我们不会进入方法onOptionsItemSelected(MenuItem item)( )。case android.R.id.home:
我究竟做错了什么?
尝试
initToolbar添加这个:类方法对我有帮助
ToolbarsetNavigationOnClickListener(),它允许您监听导航按钮上的点击,无论它看起来像什么(汉堡包、箭头或其他)。在活动代码中,只有片段返回堆栈更改侦听器必须更改: