HomeAsUp按钮在带有Appcompat 21.0.0的Android 4.2.2中没有效果



我使用的是Appcompat 21中的Toolbar,而不是标准的actionbar,除了额外活动中的HomeAsUp按钮没有效果之外,一切都很顺利。

当我打开PrefsActivity(下面的代码片段)时,HomeAsUp按钮正常显示(一个小的左箭头)。当我单击该按钮时,从代码中,我希望它"完成",但它保持不变。当我将onCreateOptionsMenu函数添加到BaseActivity并扩展只有一个菜单项Settingsglobal.xml时,单击操作如预期,但会出现一个额外的操作菜单溢出,包括Settings,这是我不希望的。然后,我尝试编辑global.xml,删除默认的Settings菜单项,结果是按钮没有再次更改。

在具有相同代码的4.4.2设备上进行测试时,问题消失了。

我的问题是,如何使PrefsActivityHomeAsUp按钮产生效果,同时不在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);

有关这些功能和其他功能的描述,请参阅文档。

最新更新