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

вот мой 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>
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, всегда кажется неполной. Итак, вот попытка изменить это.три точки | переполнение | меню опций
нет способа контролировать, будет ли ваша панель действий Показывать меню переполнения трех точек или нет в коде.
хорошо, вы можете заставить его не показывать не имея меню опций наверняка. И чтобы быть справедливым, вы можете взломать вокруг этого, больше информации на как заставить использовать меню на устройствах с кнопку меню
точки, показывающие или нет, зависят от устройства, на котором вы тестируете. Устройства с кнопкой Меню не будет отображаться значок три точки На панели действий, так как пользователи могут использовать кнопку Меню на устройстве.
устройства, которые не имеют этого меню параметров кнопка (например, устройства nexus, начиная с Galaxy) не имеют альтернативы, чтобы вызвать это меню опций. Запуск одного и того же приложения на этих устройствах покажет опцию меню переполнения трех точек на панели действий.
что вы можете контролировать
есть
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так что позвольте мне проигнорировать это.скриншот, показывающий приведенный ниже фрагмент кода в действии на устройстве удерживайте в портретном режиме:
и еще один скриншот, где есть больше места в панели действий благодаря ландшафтному режиму:
Документация Для 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 назовем его
вам нужно вызвать эту функцию в функции 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