Подтвердить что ты не робот

Элементы меню не отображаются на панели действий

Я использую appcompat в своем приложении. Я хочу, чтобы элементы меню отображались на панели действий или, по крайней мере, переполнении (3 точки), чтобы показывать их, когда нет места. На панели действий много места, но все же они не отображаются. Поток меню поднимается снизу, и это также происходит только при нажатии кнопки меню.

menu_activity.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/menu_lang"
        android:showAsAction="always"
        android:title="@string/menu_lang"
        android:icon="@android:drawable/ic_input_lang"/>

</menu>

активность:

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_activity, menu);
        return true;
    }

Этот пост говорит, что он не работает, когда присутствует кнопка меню оборудования. Но другие приложения могут показывать элементы на одном устройстве. Таким образом, этот ответ кажется неправильным. Может ли кто-нибудь помочь в этом?

enter image description here

4b9b3361

Ответ 1

Кажется, вы используете неправильное меню: Ваш файл называется "menu_activity.xml", и вы раздуваете меню с помощью идентификатора ресурса: R.menu.reminder_menu

Имя ресурса меню должно совпадать с именем файла, то есть: R.menu.manu_activity

Попробуй это снова - я наткнулся на это один раз, и это заставило меня с ума...

Обновление После выяснения, что вышеуказанная часть предназначена для обфускации, убедитесь, что:

  • Вы расширяете ActionBarActivity.
  • Вы используете (или расширяете) одну из тем Theme.AppCompat для активности (или всего приложения)
  • Поскольку на старых устройствах атрибуты, связанные с Actionbar, отсутствуют, убедитесь, что все эти атрибуты в XML используются с пользовательским пространством имен. Здесь это будет атрибут showAsAction, чтобы библиотека совместимости могла их забрать.

У вас уже было определенное пространство имен ( "приложение" в теге меню). Вам нужно изменить тег android:showAsAction на app:showAsAction в соответствии с руководством Android.

Ваше исправленное menu_activity.xml будет выглядеть следующим образом:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/menu_lang"
        app:showAsAction="always"
        android:title="@string/menu_lang"
        android:icon="@android:drawable/ic_input_lang"/>

</menu>

Расширенное руководство по Android для панели действий охватывает эти новые и неприятные ловушки...

Ответ 2

Хорошо, я думаю, что нашел решение для вас. Он называется меню переполнения, и вам нужно вызвать метод ниже в методе onCreate.

private void getOverflowMenu() {

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

Попробуйте это и сообщите мне, если он сработает для вас.

EDIT:

Думаю, я наконец понял вашу проблему. Я могу дать вам одну идею. Если вы не хотите использовать меню переполнения и просто отображать пункты меню, отображаемые на экране, который вы опубликовали, вы можете создать макет поверх своей деятельности.

Вы можете взять линейный макет, создать фон, который будет выглядеть так же, как панель действий, и поместить все иконки, которые вы хотите разместить там, и предоставить им функциональность с помощью onClickListener. Надеюсь, это даст вам некоторую идею. Таким образом вы можете создать свое собственное меню. Попробуйте макет ниже и замените ic_launcher на рисование с помощью значков меню. Затем просто установите для них onClickListeners и выполните любые функции, которые вы хотите выполнить внутри метода onClick.

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="#66000000" >

    <ImageView
        android:id="@+id/xMenuBtn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:background="@drawable/ic_launcher" />
     <TextView
        android:id="@+id/xMenuTxt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Chats"
        android:textSize="18sp"
        android:layout_toRightOf="@+id/xMenuBtn1"
        android:layout_centerVertical="true" />
    <ImageView
        android:id="@+id/xMenuBtn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/xMenuBtn3"
        android:background="@drawable/ic_launcher" />
    <ImageView
        android:id="@+id/xMenuBtn3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:background="@drawable/ic_launcher" />

</RelativeLayout>

Ответ 3

Попробуйте в своей деятельности onCreate():

ActionBar bar = getSupportActionBar();
bar.setTitle(R.string.app_name);

а затем:

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {    
        menu.clear();
        getSupportMenuInflater().inflate(R.menu.menu_activity, menu);
        return super.onPrepareOptionsMenu(menu);
    }