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

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

Я сделал совершенно новый проект. Я добавил элементы в файл макета 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>
4b9b3361

Ответ 1

Поскольку вы устанавливаете атрибут showAsAction в 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>

Ответ 2

Контекст

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

Три точки | переполнение | меню параметров

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

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

Точки, которые отображаются или не зависят от устройства, которое вы тестируете,. Устройства с кнопкой меню НЕ ПОКАЗЫВАЮТ значок трех точек на панели действий, так как пользователи могут использовать кнопку меню на устройстве.

options menu button on device

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

actionbar showing options menu

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

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

Согласно официальному ресурсу ресурсов меню, следующие опции:

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

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

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

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

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

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

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

collapsed title and mostly icons on vertical orientation

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

landscape mode actionbar rendered

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

Лучшим документом для разработки этой панели действий будет руководство по действию. Если вы ищете более для рекомендаций по разработке, следуйте этой ссылке. Ссылка на ресурс была указана ранее. Для меню в целом проверьте это.

Фрагмент кода

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

Содержимое файла /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>

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

Ответ 3

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

Внутри onCreate() выполните:

  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
    }

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

Edit:

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

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

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

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

Ответ 4

ИЛИ вы могли бы создать такую ​​структуру, как:

<?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>

В том месте, где вы можете создать новый значок с трехконечным значком значок.

Ответ 5

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

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

app:showAsAction=

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

Ответ 6

Добавить

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

в методе onCreate.

Ответ 7

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

RequestWindowFeature (Window.FEATURE_ACTION_BAR);

Ответ 8

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

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

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

 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 назовите его

ссылки: fooobar.com/questions/63409/...

Ответ 9

добавьте собственное пространство имен, подобное этому, чтобы показатьAsAction и 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" />