Пользовательские кнопки панели действий AppCompatActivity не отображаются на Android 4.1.2

На 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'

person Justin Case    schedule 06.08.2015    source источник
comment
добавить файл макета my_activity   -  person chain    schedule 06.08.2015


Ответы (2)


Спасибо за ответ. Я сделал то, что предложили эти два ответа:

Как принудительно использовать дополнительного меню на устройствах с кнопкой меню

Панель действий не отображается с AppCompat

Подводя итог решения:

  1. Я изменил «myApp» на «compat» в активности xml (исправил отсутствующие кнопки)
  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

person Justin Case    schedule 06.08.2015
comment
Я считаю, что добавление этого кода работает только с ActionBarSherlock. - person Jared Burrows; 06.08.2015
comment
@ Джаред Берроуз Не знаю про ActionBarSherlock, не пробовал. Но это определенно работает с AppCompat. - person Justin Case; 07.08.2015
comment
Я думаю, что изменение "myApp" to "compat" in the activity xml исправило это. Однако я не уверен, я видел это раньше. Я уже перешел на Toolbar. - person Jared Burrows; 07.08.2015
comment
Я сначала тоже так думал. Но я быстро обнаружил, что это решает только проблему с отсутствующими кнопками. Чтобы появилась кнопка меню, мне пришлось добавить код Java. - person Justin Case; 09.08.2015

Вместо этого вы должны использовать панель инструментов.

Поместите это в свой 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);
}
person Rodrigo Henriques    schedule 06.08.2015
comment
Он не использует Toolbar, а только пытается показать меню overflow. - person Jared Burrows; 07.08.2015