Панель действий Android не показывает переполнение

90

В моем приложении есть панель действий с 3 элементами.

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

Вот соответствующий код: list_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_insert"
    android:icon="@android:drawable/ic_menu_add"
    android:title="@string/menu_insert" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_call"
    android:icon="@android:drawable/ic_menu_call"
    android:title="@string/menu_call" 
    android:showAsAction="ifRoom|withText"/>
<item android:id="@+id/menu_agenda"
    android:icon="@android:drawable/ic_menu_agenda"
    android:title="@string/menu_agenda" 
    android:showAsAction="ifRoom|withText"/>
</menu>

Activity.java

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater mi = getMenuInflater();
    mi.inflate(R.menu.list_menu, menu);
    return true;
}
Матс Раемен
источник
120
Если на вашем устройстве есть кнопка меню, значок переполнения не отображается. На каком ты устройстве?
Reinier
1
виртуальное устройство, на котором я тестирую, действительно имеет кнопку меню, щелкнул ее, и пропавший элемент появился, спасибо!
Mats Raemen
2
@Reinier Я использую ActionBarSherlock. В Galaxy Ace 2.3 он отображается, в Galaxy SII 4.0 он не отображается. У обоих есть кнопка меню HW.
Мистер Смит
2
Я хотел подтвердить, что меня озадачило то, что у меня был значок переполнения на Nexus 7, а не на Galaxy Note II. В Note была кнопка меню. Благодарность!
bsautner
@Reinier, пожалуйста, помогите мне столкнуться с той же проблемой, что мне делать?
рупеш

Ответы:

125

Если вы хотите отобразить три точки, независимо от кнопки меню устройства! то вы можете вызвать этот метод в своем классе приложения onCreate method-

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());
    }
}
Атул Кошик
источник
32
Это ужасный взлом, нарушающий согласованность с остальными приложениями на платформе. Не делайте этого.
adamp
19
Это кажется меньшим из двух зол. Текущее поведение неприемлемо.
biorbnA
6
Это отличный способ разрешить переполнение, жесткая клавиша меню больше не должна допускаться.
Necronet
5
Отлично работает! Работает, даже если пользователь нажимает кнопку аппаратного меню (что великолепно), хотя вы услышите звуковой эффект меню дважды ... кто-нибудь знает, как сделать так, чтобы он звучал только один раз?
Брюс
5
ЭТО НЕ ВЗЛОМ. Разработчикам нужно знать, что называть взломами, поскольку в Android это не 2 + 2. Отражение экономит время, используя механизмы Java, иначе вы бы передавали контексты своим внутренним классам 24/7 или настраивали AOSP до бесконечности. Для меня это решение решает проблему необходимости переопределения и включения тонны настраиваемого контента AOSP И связанных частных ассоциаций только ради того, что пуристы считают чистым. Знаете ли вы, что нельзя принудительно включить FASTSCROLL постоянно для небольших списков? Прежде чем я использовал отражение, мне потребовалось скопировать 10+ ресурсов AOSP для редактирования ОДНОГО символа.
leRobot 01
53

Панель действий

res / menu / menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- Search / will display always -->
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:showAsAction="always"
        android:title="@string/action_search"/>

    <!-- Location Found -->
    <item
        android:id="@+id/action_location_found"
        android:icon="@drawable/ic_action_location_found"
        android:showAsAction="always"
        android:title="@string/action_location_found"/>

    <!-- More -->
    <item
        android:id="@+id/a_More"
        android:icon="@drawable/ic_action_overflow"
        android:showAsAction="always"
        android:title="More">
        <menu>

            <!-- Refresh -->
            <item
                android:id="@+id/action_refresh"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_refresh"/>

            <!-- Help -->
            <item
                android:id="@+id/action_help"
                android:icon="@drawable/ic_action_help"
                android:showAsAction="never"
                android:title="@string/action_help"/>

            <!-- Check updates -->
            <item
                android:id="@+id/action_check_updates"
                android:icon="@drawable/ic_action_refresh"
                android:showAsAction="never"
                android:title="@string/action_check_updates"/>
        </menu>
    </item>

</menu>

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

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

        return super.onCreateOptionsMenu(menu);
    }

}

Загрузите набор значков панели действий

Кирит Вагела
источник
2
Взгляните на комментарий @Reinier, это правда: «Если на вашем устройстве есть кнопка меню, значок переполнения не будет отображаться».
Ахмад Дваик 'Warlock'
Я тестирую устройство с кнопкой меню, и в моем случае отображается переполнение. Я использую android:showAsAction="always"для большего количества предметов
Кирит Вагела
на каком устройстве тестировал? Я использовал neo v xperia и s #
Ахмад Дваик 'Warlock'
1
Примечание: ваш элемент, который расширяет ваше дополнительное меню, ДОЛЖЕН showAsAction = "always"
Кирит Вагела
1
showAsAction недоступно в пространстве имен android в более старых SDK. Перейдите по этой ссылке developer.android.com/training/basics/actionbar/…, чтобы решить эту проблему. После добавления этого NS schemas.android.com/apk/res-auto вышеуказанный трюк отлично сработал для меня
chedine
42

Я понимаю, что это не дополнительное меню, но оно похоже. Хорошо, это просто, но было трудно понять.

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

<item
        android:id="@+id/a_More"
        android:icon="@drawable/more"
        android:showAsAction="always"
        android:title="More">
        </item>

Когда у вас есть элемент, добавьте подменю, содержащее нужные вам элементы, в дополнительное меню. Пример:

<item
    android:id="@+id/a_More"
    android:icon="@drawable/more"
    android:showAsAction="always"
    android:title="More">
    <menu>
        <item
            android:id="@+id/aM_Home"
            android:icon="@drawable/home"
            android:title="Home"/>
    </menu>
</item>

При нажатии это приведет к надуванию других предметов внутри. Мое приложение использует ActionBarSherlock 4.0, поэтому, прежде чем это сработает для вас, вам необходимо получить доступ к «SplitActionBar». (Будет по-прежнему работать на панели действий Android по умолчанию)

Вот как: в вашем файле AndroidManifest.xml вам нужно добавить этот код под действие, в котором вам нужно меню переполнения.

android:uiOptions="splitActionBarWhenNarrow"

ПРИМЕЧАНИЕ: ваш элемент, который расширяет ваше дополнительное меню, ДОЛЖЕНshowAsAction="always"

Ввола! у вас переполненное меню! Надеюсь, я помог тебе. :)

LeviRockerSk8er
источник
3
Хорошее решение, лучше, чем взломать кнопку меню.
ol0
26

На устройствах с кнопками аппаратного меню (Galaxy S3, упрямый, как Samsung ...) меню переполнения ведет себя как «традиционное» меню с помощью кнопки аппаратного меню.

Лукас Батто
источник
2
Старый ответ, однако с библиотекой совместимости, просто наткнулся на очень странные результаты: 3 устройства с аппаратной кнопкой, примечание 3 Neo = отображается меню переполнения, кнопка меню не работает, примечание 1 = нет переполнения, кнопка меню работает, Galaxy S3, нет переполнение, кнопка меню не работает! Это безумие.
3c71 08
5

Когда вы говорите «меню переполнения», вы имеете в виду три точки, которые появляются в конце, чтобы указать, что есть другие элементы ... или вы имеете в виду разделенную панель действий, которая появляется внизу для элементов переполнения?

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

android:uiOptions="splitActionBarWhenNarrow"

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

wnafee
источник
Я имею в виду три точки. Не похоже, что это из-за предметов, потому что всякий раз, когда меняют элементы заказа, отображаются первые 2 значка
Mats Raemen
должен ли я предоставить дополнительную информацию, чтобы определить реальную проблему?
Mats Raemen
Каковы ваши minSdkVersion, targetSdkVersion и версия, на которой вы тестируете?
Sparky
5
Есть ли у вашего устройства физические кнопки для меню или они виртуальные, как телефон Galaxy Nexus? Я думаю, что три точки появятся, только если на вашем телефоне нет физических кнопок.
wnafee
5

Чтобы всегда отображать переполнение действия (три точки) на панели действийcompat:
в файле меню, например:
main.xml

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

    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        app:showAsAction="never"/>
    <item
        android:id="@+id/action_about"
        android:title="@string/action_about"
        app:showAsAction="never"/>

</menu>

и в файле активности:

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

У меня это сработало.
Проверено на Google Nexus S, Samsung S3.

MrSiro
источник
3

Похоже, что на устройствах с кнопкой меню дополнительное меню не отображается в ActionBar. Также у нас нет способа узнать, есть ли на устройстве кнопка аппаратного меню до уровня API 14 (4.0+).

Это решение добавляет кнопку переполнения к кнопке, android.support.v7.app.ActionBarкоторая открывает стандартное меню опций только в версии до Honeycomb (<3.0), в противном случае оставляя это для системы. В любом случае вы можете выбирать между alwaysили ifRoomдля всех действий.

Получите значок переполнения из пакета значков панели действий .

Добавить меню (я отбрасываю некоторые нерелевантные части, такие как заголовки, порядок и т. Д.)

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

<item
    android:id="@+id/action_overflow"
    android:orderInCategory="100"
    android:icon="@drawable/ic_action_overflow"
    app:showAsAction="always" />

<item
    android:id="@+id/action_first"
    app:showAsAction="always" />

<item
    android:id="@+id/action_second"
    app:showAsAction="ifRoom" />

</menu>

Удалите наше действие переполнения на 3.0+

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        menu.removeItem(R.id.action_overflow);
    }
    return super.onPrepareOptionsMenu(menu);
}

Наконец вызов Activity.openOptionsMenu()из действия переполнения.

Э ... нет. Вы не можете не позвонить openOptionsMenu()из кнопки меню ... но если вы используете AndroidAnnotations , это легко сделать:

@OptionsItem
void action_overflow() {
    openOptionsMenuDeferred();
}

@UiThread
void openOptionsMenuDeferred() {
    openOptionsMenu();
}

Если нет, вы должны сделать что-то вроде этого, я полагаю

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == id.action_overflow) {
        openOptionsMenuDeferred();
        return true;
    }
}

private Handler handler = new Handler(Looper.getMainLooper());
public void openOptionsMenuDeferred() {
    handler.post(new Runnable() {
        @Override
        public void run() {
            openOptionsMenu();
        }
    }
    );
}
IlDan
источник
2

Попробуйте изменить тему приложения с Theme.AppCompat.Light.DarkActionBar на Theme.AppCompat.Light

Сагар Деванга
источник
2

Поместите xmlns:your_app_name="http://schemas.android.com/apk/res-auto"внутри тега меню и вместо этого android:showAsAction="always"используйтеyour_app_name:showAsAction="always"

например, для

<item
    android:id="@+id/action_search"
    android:icon="@drawable/icon_search"
    android:title="@string/search"
    your_app_name:showAsAction="ifRoom"/>

Рашми Джайн
источник