【问题标题】:AppCompatActivity custom ActionBar buttons do not appear on Android 4.1.2AppCompatActivity 自定义 ActionBar 按钮不会出现在 Android 4.1.2
【发布时间】:2026-02-15 14:40:01
【问题描述】:

在 5.1 上可以正常工作,但在 4.1.2 上不行

我错过了什么?

这里是活动 xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:myApp="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/transfer"
        android:title="@string/transfer"
        android:icon="@drawable/ic_transfer"
        myApp:showAsAction="always" />
    <item android:id="@+id/refresh"
        android:title="@string/refresh"
        android:icon="@drawable/ic_refresh"
        myApp:showAsAction="always" />
    <item android:id="@+id/about"
        android:title="@string/about"
        android:icon="@android:drawable/ic_menu_info_details"
        android:orderInCategory="100"
        myApp:showAsAction="never" />
    <item android:id="@+id/help"
        android:title="@string/title_activity_help"
        android:icon="@android:drawable/ic_menu_info_details"
        android:orderInCategory="101"
        myApp:showAsAction="never" />
    <item android:id="@+id/settings"
        android:title="@string/settings"
        android:icon="@android:drawable/ic_menu_info_details"
        android:orderInCategory="102"
        myApp:showAsAction="never" />
    <item android:id="@+id/search"
        android:title="@string/search"
        android:icon="@android:drawable/ic_menu_info_details"
        android:orderInCategory="103"
        myApp:showAsAction="never" />
    <item android:id="@+id/logout"
        android:title="@string/logout"
        android:icon="@android:drawable/ic_menu_info_details"
        android:orderInCategory="104"
        myApp:showAsAction="never" />
</menu>

这是我的活动类(女巫扩展了另一个扩展 AppCompatActivity 的活动):

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.my_activity, menu);
    return true;
}

我正在使用以下 appcompat 库:

'com.android.support:appcompat-v7:22.2.0'

【问题讨论】:

  • 添加布局文件 my_activity

标签: android android-actionbar appcompatactivity android-4.1-jelly-bean


【解决方案1】:

感谢您的回复。我做了这两个答案的建议:

How to force use of overflow menu on devices with menu button

Actionbar not shown with AppCompat

总结一下解决方案:

  1. 我在活动 xml 中将“myApp”更改为“compat”(修复了缺少的按钮)
  2. 我添加了这段代码

    try {
        ViewConfiguration config = ViewConfiguration.get(this);
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if(menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception ex) {
        // Ignore
    }
    

到我的基本活动(所有其他活动都扩展),它扩展了 AppCompatActivity(修复了丢失的菜单)

现在它适用于 5.1 和 4.1.2

【讨论】:

  • 添加我认为仅适用于 ActionBarSherlock 的代码。
  • @Jared Burrows 我不知道 ActionBarSherlock,没试过。但它确实适用于 AppCompat。
  • 我认为更改"myApp" to "compat" in the activity xml 修复了它。但是,我不确定,我以前见过这个。我已经切换到Toolbar
  • 起初我也认为它会。但我很快发现它只解决了缺少按钮的问题。为了显示菜单按钮,我必须添加 Java 代码。
【解决方案2】:

您应该改用工具栏。

把它放在你的 XML 中:

<android.support.v7.widget.Toolbar
    android:id="@id/toolbar"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary" />

此代码进入您的活动:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    if (toolbar != null) {
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        getSupportActionBar().setTitle(getTitle());
    }
}

比你只是膨胀你的菜单:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == android.R.id.home) {
        onBackPressed();
        return true;
    }

    return super.onOptionsItemSelected(item);
}

【讨论】:

  • 他没有使用Toolbar,他只是想让overflow菜单显示。