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



Я сделал совершенно новый проект. Я добавил элементы в menu файл макета. Эти элементы не отображаются на правой стороне панели действия. Я помню, что появляется значок с тремя точками, который открывает меню.



enter image description here



вот мой Activity



public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar = getActionBar();
actionBar.setBackgroundDrawable(new ColorDrawable(Color.BLUE));
actionBar.show();
}

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

}


а вот и мой main.xml



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

<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_option1"/>
<item
android:id="@+id/action_settings34"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_option2"/>
<item
android:id="@+id/action_settings3"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_option3"/>


</menu>
724   11  

11 ответов:

Так как вы установили до never, тогда эти пункты меню никогда не будут отображаться в виде представлений действий. Попробуйте это:

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

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="ifRoom|withText"
        android:title="@string/action_option1"/>
    <item
        android:id="@+id/action_settings34"
        android:orderInCategory="100"
        android:showAsAction="ifRoom|withText"
        android:title="@string/action_option2"/>
    <item
        android:id="@+id/action_settings3"
        android:orderInCategory="100"
        android:showAsAction="ifRoom|withText"
        android:title="@string/action_option3"/>

</menu>

контекст

там, кажется, недоразумение об этом showAsAction свойство в меню конфигурация. Информация, которую я нахожу во многих ответах stackoverflow, всегда кажется неполной. Итак, вот попытка изменить это.

три точки | переполнение | меню опций

нет способа контролировать, будет ли ваша панель действий Показывать меню переполнения трех точек или нет в коде.

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

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

options menu button on device

устройства, которые не имеют этого меню параметров кнопка (например, устройства nexus, начиная с Galaxy) не имеют альтернативы, чтобы вызвать это меню опций. Запуск одного и того же приложения на этих устройствах покажет опцию меню переполнения трех точек на панели действий.

actionbar showing options menu

что вы можете контролировать

есть showAsAction опция в меню xml-файл, который можно использовать для контролировать, как этот единственный пункт меню будет показывать вверх на панели действий.

согласно официальному меню ресурса doc варианты:

android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]

The ifRoom флаг показывает только вариант, если есть достаточно места. Это должно быть вашим первым выбором в большинстве случаев. Однако это приведет к сжатию заголовка в панели действий (см. вертикальный ориентированный снимок экрана).

The never флаг будет иметь эту опцию Всегда в меню переполнения и никогда непосредственно в панели действий.

использование always флаг не рекомендуется, так как это заставит опцию всегда появляться в acitonbar. Даже если работает на очень маленьком размере экрана. Это может сделать заголовок полностью невидимым.

как вы могли бы теперь меню опций может иметь как android:title и android:icon собственность. Вы можете использовать withText флаг вместе с always или ifRoom (использовать трубы | in between), чтобы заставить текст элемента отображаться рядом со значком при визуализации в панели действий.

The collapseActionView поддерживается только с API level 14 так что позвольте мне проигнорировать это.

скриншот, показывающий приведенный ниже фрагмент кода в действии на устройстве удерживайте в портретном режиме:

collapsed title and mostly icons on vertical orientation

и еще один скриншот, где есть больше места в панели действий благодаря ландшафтному режиму:

landscape mode actionbar rendered

Документация Для Android

лучший документ о разработке эта панель действий будет руководство actionbar. Если вы ищете больше для руководства по дизайну перейдите по этой ссылке. Элемент ссылка на ресурс меню был указан ранее. Ибо меню В общем проверить это.

код

код только для справки, так как эта часть кажется правильной в большинстве ответов. Более полный пример можно найти в https://github.com/AndroidExamples/fragment-navigation

The /res/menu/main.xml файл содержимое:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="be.hcpl.android.example.MainActivity" >

<!-- an option that never appears as a fixed text/icon in the actionbar -->
<item android:id="@+id/action_one"
    android:title="@string/action_one"
    android:orderInCategory="100"
    app:showAsAction="never" />

<!-- another option that only appears if there is enough room -->
<item android:id="@+id/action_two"
    android:title="@string/action_two"
    android:orderInCategory="200"
    app:showAsAction="ifRoom" />

<!-- a last option that always appears -->
<item android:id="@+id/action_three"
    android:title="@string/action_three"
    android:orderInCategory="300"
    app:showAsAction="always" />

<!-- an option to show with both icon and text -->
<item android:id="@+id/action_four"
    android:icon="@android:drawable/ic_menu_directions"
    android:title="@string/action_four"
    android:orderInCategory="400"
    app:showAsAction="withText|always" />

<!-- an option to always show as an icon only -->
<item android:id="@+id/action_five"
    android:icon="@android:drawable/ic_menu_info_details"
    android:title="@string/action_five"
    android:orderInCategory="500"
    app:showAsAction="always" />

</menu>

некоторые связанные ответы

Я думаю, что вы хотите всегда показывать значок меню переполнения в правом верхнем углу и хотите, чтобы ваше меню открывалось оттуда. Попробуйте что-то вроде следующего, чтобы заставить его есть:

внутри onCreate() do:

  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
    }

это заставит приложение, чтобы показать меню переполнения. Кнопка меню по-прежнему будет работать, но она откроет меню в правом верхнем углу. Взято из этой ответ как заставить использовать меню на устройствах с кнопку меню . Это может быть своего рода "хак", но он работает.

Edit:

основываясь на полезных комментариях от @gunar, я прошу не использовать этот метод. Ниже приведены причины:

  • частное поле sHasPermanentMenuKeyможет быть преобразована в будущем выпуск. Тогда ваше приложение перестанет работать.

  • также, если вы принудительно перемещаете элементы действия на панель действий, потому что вы привыкнув к ним, вы в конечном итоге запутаетесь пользователи, которые привыкли к тому, как приложения запустите на своем устройстве. Те, кто с аппаратным menu ключ будет использоваться для есть параметры, показанные из меню аппаратной клавиши. Если вы намеренно покажите им три точки меню переполнения, это может запутать их.

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

или вы могли бы создать структуру:

<?xml version="1.0" encoding="utf-8"?>
<menu >
<item
    android:id="@+id/menu_main"
    android:icon="@drawable/icon_menu"
    android:showAsAction="always"
    android:title="@string/menu_A"
    android:visible="true">
    <menu>
        <item
            android:id="@+id/menu_settings1"
            android:showAsAction="never"
            android:title="@string/menu_A1"/>
        <item
            android:id="@+id/menu_settings2"
            android:showAsAction="never"
            android:title="@string/menu_A2"/>
        <item
            android:id="@+id/menu_settings3"
            android:showAsAction="never"
            android:title="@string/menu_A3"/>
    </menu>
</item>
</menu>

где icon_menu вы можете создать новый набор иконок с тремя точками значок клипарта.

У меня была та же проблема. И я сделал все то, что было сказано выше. Моя проблема была в том, что я забыл переопределить onCreateoptionMenu (меню Меню).

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

добавить

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

в методе onCreate.

после поиска и чтения много ответа, я обнаружил, что есть еще одна мелочь, на которую вы должны обратить внимание.

по крайней мере это была моя проблема и я не нашел ответ выше. На вашем . Ваш android:showAsAction= не должно быть вида android пакет, он должен быть от app пакета, как в примере ниже:

app:showAsAction=

не забудьте импортировать app пакета.

все ответы выше объяснили эту проблему хорошо

но можем ли мы переопределить это ограничение и иметь пункт меню переполнения?!!

да, мы можем взломать

 private void makeActionOverflowMenuShown() {
    //devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu
    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) {
        Log.d(TAG, e.getLocalizedMessage());
    }
}

а внутри onCreate назовем его

ссылки:https://stackoverflow.com/a/13098824/4251431

вам нужно вызвать эту функцию в функции onCreate действия.

RequestWindowFeature (Window.FEATURE_ACTION_BAR);

добавить пользовательское пространство имен, как это showAsAction и actionViewClass

<menu xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/search"
    android:title="@string/search"
    android:icon="@drawable/ic_search"
    app:showAsAction="collapseActionView|ifRoom"
    app:actionViewClass="android.widget.SearchView" />

то, что работало для меня, меняло свойство в меню.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:id="@+id/gamingactivity_filter" android:showAsAction="ifRoom"   android:icon="@drawable/ic_filter"/> 

это раньше работало в Material тема, но не для AppCompat тема и активность, поэтому я изменил, как мое меню.XML и добавить app:showAsAction= свойство в пространстве имен'"http://schemas.android.com/apk/res-auto"

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
  <item android:id="@+id/gamingactivity_filter" android:showAsAction="ifRoom"  app:showAsAction="ifRoom" android:icon="@drawable/ic_filter"/>

от actvity надуть меню через OnCreateOptionsMenu(IMenu menu) а теперь от OnOptionsItemSelected() Я также могу получить идентификатор выбранного элемента как

 public override bool OnOptionsItemSelected(IMenuItem item)
        {
                switch (item.ItemId)
                {
                    case Resource.Id.gamingactivity_filter:
                        OnBackPressed();
                        break;
                }
            }
            return true;
        }

Comments

    Ничего не найдено.