【问题标题】:HomeAsUp Button has no effect in Android 4.2.2 with Appcompat 21.0.0HomeAsUp 按钮在带有 Appcompat 21.0.0 的 Android 4.2.2 中无效
【发布时间】:2014-11-11 07:36:54
【问题描述】:

我正在使用 Appcompat 21 中的工具栏而不是标准操作栏,一切都很顺利,除了额外活动中的 HomeAsUp 按钮不起作用。

当我打开PrefsActivity(下面的代码sn-ps)时,HomeAsUp按钮正常显示(一个小左箭头),当我点击按钮时,从代码中,我想要它“完成”,但它仍然没有变化。当我将 onCreateOptionsMenu 函数添加到 BaseActivity 并膨胀只有一个菜单项 Settingsglobal.xml 时,单击按预期进行,但需要额外的操作出现包含 Settings 的菜单溢出,这是我不想要的。然后我尝试编辑global.xml,删除默认的Settings菜单项,结果按钮再次没有变化。

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

我的问题是,如何在BaseActivity中不添加onCreateOptionsMenu菜单项的情况下制作PrefsActivity效果的HomeAsUp按钮?

部分代码如下:

基础活动:

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;
    }
}

【问题讨论】:

  • 你有什么问题?
  • @MohammedAli 我已经编辑了问题并说清楚了,谢谢你的提醒。
  • “HomeAsUp”按钮的 PrefsActivity 效果...什么效果?

标签: android toolbar android-appcompat


【解决方案1】:

我已经对我想在这里贡献的问题进行了一些类似的研究。我可以确认,在菜单中没有任何项目的情况下,使用支持工具栏时,在 Android 4.2.2 中不会触发 home/up 事件。

最新版本的支持库 21.0.2 中也存在同样的问题。
parentactivity 和 meta parentactivity 的清单设置无效。
通过getSupportActionBar().setXXX() 操作设置无效。
我能想到的唯一“解决方法”是使用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 上完全损坏。

我已将此作为错误提交给 Google,可在此处跟踪: https://code.google.com/p/android/issues/detail?id=81528

【讨论】:

  • 截至appcompat 22.1.1 我实际上在 api 18 / Android 4.3 上看到了这个问题。所有其他 android 版本似乎都很好。
【解决方案2】:

在您的PrefsActivity 中添加:

getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);

另请参阅docs,了解这些功能和其他用于您目的的功能的描述。

【讨论】:

  • 以上功能用于设置HomeAsUp按钮所需的功能。你有没有尝试在 PrefActivity 中添加
猜你喜欢
  • 2015-05-30
  • 1970-01-01
  • 2014-12-31
  • 2015-01-06
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
相关资源
最近更新 更多