我正在开发一个支持 Gingerbread 及更高版本的带有 ActionBars 的应用程序。所以基本上我正在使用支持库并扩展
动作栏活动
我所有的活动。一切都很好,除了
方法。它只是没有按照文档中的说明被调用。
每当用户从操作栏中选择在应用程序的活动层次结构中向上导航时,都会调用此方法。
这很容易,但我无法弄清楚为什么它不能按预期工作,谷歌搜索也没有帮助。这是一个错误吗?还是我错过了什么?
我正在开发一个支持 Gingerbread 及更高版本的带有 ActionBars 的应用程序。所以基本上我正在使用支持库并扩展
动作栏活动
我所有的活动。一切都很好,除了
方法。它只是没有按照文档中的说明被调用。
每当用户从操作栏中选择在应用程序的活动层次结构中向上导航时,都会调用此方法。
这很容易,但我无法弄清楚为什么它不能按预期工作,谷歌搜索也没有帮助。这是一个错误吗?还是我错过了什么?
如果您覆盖onOptionsItemSelected
,则onSupportNavigateUp
不会被调用。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// handle ⬅️ button here
break;
}
return true;
}
如前所述,如果您覆盖OnOptionsItemSelected
,OnSupportNavigateUp
将不会被调用。您可以通过添加 default: case 来确保它被调用,OnOptionsItemSelected
如下所示:
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.something:
Intent intent = new Intent(this,someActivity.class);
startActivity(intent);
finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
将super.onOptionsItemSelected(item)
确保OnSupportNavigateUp
被调用。这是以防万一您不希望在您的内部处理案件OnOptionsItemSelected
您是否在 Manifest.xml 文件中设置了父活动?如果是,它不会被调用。@see http://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html#onSupportNavigateUp()
谁知道...onSupportNavigateUp()
仅适用于 4.0 及更高版本。因为下面onNavigateUp()
被称为。
从 onCreateOptionsMenu() 返回 true 也很重要,我将其设置为 false,因为我有自定义菜单,但未调用 onOptionsItemSelected()!
所以使用:
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
//menuInflater.inflate(R.menu.main, menu)
return true
}
接着
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// 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.
when (item.itemId) {
R.id.action_share -> return true
else -> return super.onOptionsItemSelected(item)
}
}
我有同样的问题onSupportNavigateUp并且onOptionsItemSelected没有调用
我需要防止对子片段进行 backPress,因此我在工具栏中覆盖 setNavigationOnClickListener
toolbar.setNavigationOnClickListener {
if(childFragmentHandleBackPressed()){
NavigationUI.navigateUp(
navController,
AppBarConfiguration(navController.graph, drawerLayout)
)
}
}
或者,如果您不想在开始/根片段上打开导航抽屉菜单,则可以使用navController.navigateUp()
因此,实际上,当您覆盖时,onOptionsItemSelected
您应该false
默认返回onSupportNavigateUp
要调用的方法。见下文
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_print -> {
doSomething()
return true
}
}
return false
}
override fun onSupportNavigateUp(): Boolean {
onBackPressed()
return true
}
您需要在 onCreate() 方法中添加这一行
supportActionBar?.setDisplayHomeAsUpEnabled(true)
连同 ononSupportNavigateUp()
方法