invalidateOptionsMenu() 与 AppCompatActivity 不兼容。

4

我将我的Activity改为了AppCompatActivity,现在在onOptionsItemSelected()中调用invalidateOptionsMenu()不再像之前一样更新菜单项。 onPrepareOptionsMenu()没有被调用。

我添加了以下依赖:

compile "com.android.support:appcompat-v7:22.2.1"

我将我的Activity更新为AppCompatActivity(请注意,在onResume()中只有第一次调用invalidateOptionsMenu()有效,而其他两个则无效):

public class MyActivity extends AppCompatActivity {

    private boolean isStopSaved;

    // ...

    @Override
    protected void onResume() {
        super.onResume();

        if (/* Check DB if star should be set */) {
            isStopSaved = true;
        } else {
            isStopSaved = false;
        }
        invalidateOptionsMenu(); // This updates the menu as expected
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {

        // ...

        return super.onPrepareOptionsMenu(menu);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_schedule, menu);   
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_starred_add:
            isStopSaved = true;
            invalidateOptionsMenu(); // Does not update menu
            break;

        case R.id.menu_starred_remove:
            isStopSaved = false;
            invalidateOptionsMenu(); // Does not update menu
            break;
    }
    return super.onOptionsItemSelected(item);
}

编辑:我的设备运行的是Android M预览版2。

3个回答

15

3
appcompat-v7 的源码中,invalidateOptionsMenu()supportInvalidateOptionsMenu() 执行的是相同的功能:https://github.com/android/platform_frameworks_support/blob/master/v7/appcompat/src/android/support/v7/app/AppCompatActivity.java#L186 - Ryan R
我明白了 - 当我们只有ActionBarActivity时,情况并非如此。 - natario
是的,我认为当ActionBarActivity被弃用后,使用AppCompatAcitivity取而代之时,可能发生了一些变化。也许这是appcompat-v7库或Android M的一个错误。 - Ryan R

1
我测试了最新的支持库,发现它再次正常运行。
com.android.support:appcompat-v7::23.0.1

0

将您的onOptionsItemSelected更改如下:

switch (item.getItemId()) {
    case R.id.menu_starred_add:
        isStopSaved = false;
        invalidateOptionsMenu();
        break;

    case R.id.menu_starred_remove:
        isStopSaved = true;
        invalidateOptionsMenu();
        break;
}

1
逻辑没问题,因为在“Activity”中它能正常工作。问题是“onPrepareOptionsMenu()”没有被调用。 - Ryan R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接