我使用的是Appcompat 21中的Toolbar,而不是标准的actionbar,除了额外活动中的HomeAsUp按钮没有效果之外,一切都很顺利。
当我打开PrefsActivity
(下面的代码片段)时,HomeAsUp按钮正常显示(一个小的左箭头)。当我单击该按钮时,从代码中,我希望它"完成",但它保持不变。当我将onCreateOptionsMenu
函数添加到BaseActivity
并扩展只有一个菜单项Settings的global.xml时,单击操作如预期,但会出现一个额外的操作菜单溢出,包括Settings,这是我不希望的。然后,我尝试编辑global.xml,删除默认的Settings菜单项,结果是按钮没有再次更改。
在具有相同代码的4.4.2设备上进行测试时,问题消失了。
我的问题是,如何使PrefsActivity
的HomeAsUp按钮产生效果,同时不在BaseActivity
中添加onCreateOptionsMenu
的菜单项?
一些代码段如下:
基本活动:
public abstract class BaseActivity extends ActionBarActivity {
protected Toolbar mActionBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutResource());
mActionBar = (Toolbar) findViewById(R.id.toolbar_actionbar);
setSupportActionBar(mActionBar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
}
protected abstract int getLayoutResource();
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
this.finish();
return true;
case R.id.action_settings:
startActivity(new Intent(this, PrefsActivity.class));
return true;
default:
return super.onOptionsItemSelected(item);
}
// add this function, the button acts normally, but an extra
// action overflow menu appears in the right side of the Toolbar
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.global, menu);
return true;
}
//...
}
PrefsActivity.java:
public class PrefsActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction()
.replace(R.id.frag_container, new PrefsFragment())
.commit();
}
@Override
protected int getLayoutResource() {
return R.layout.activity_prefs;
}
}
我已经对这个问题做了一些类似的研究,我想在这里对此做出贡献。我可以确认,在菜单中没有任何项目的情况下,在使用支持工具栏时,Android 4.2.2中不会触发home/up事件。
最新版本的支持库21.0.2中也存在同样的问题。
parentactivity和meta parentActivities的清单设置没有任何效果
通过CCD_ 7操纵设置没有效果
我能想到的唯一"变通方法"是使用toolbar.setNavigationOnClickListener()
来获取事件。
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR1) {
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(ToolbarActivity.this, "Up clicked",
Toast.LENGTH_SHORT).show();
NavUtils.navigateUpFromSameTask(ToolbarActivity.this);
}
});
}
通过这种方式,至少其他平台可以正常工作,v17可以有这种奇怪的解决方法,这样jellybean mr1上的工具栏就不会完全损坏。
我已经向谷歌提交了一个bug,可以在这里跟踪:https://code.google.com/p/android/issues/detail?id=81528
在PrefsActivity
内部添加:
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
有关这些功能和其他功能的描述,请参阅文档。