Панель дій 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.
Mister Smith

2
Я хотів підтвердити, що це мене збило з пантелику тим, що я мав піктограму переповнення на Nexus 7, а не на Galaxy Note II. Примітка мала кнопку меню. Дякую!
bsautner

@Reinier, будь ласка, допоможіть мені зіткнутися з тією ж проблемою, що мені робити?
rupesh

Відповіді:


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
Це чудовий спосіб дозволити переповнення, важка клавіша меню більше не допускається.
Некронет

5
Це чудово працює! Працює, навіть якщо користувач натискає кнопку апаратного меню (це чудово), хоча звуковий ефект меню ви почуєте двічі .. хтось знає, як зробити так, щоб воно звучало лише один раз?
Брюс

5
ЦЕ НЕ ЗЛАМА. Розробники повинні знати, як називати хакерів, оскільки це просто не 2 + 2 в Android. Рефлексія - це економія часу за допомогою механізмів Java, інакше ви передавали б контекст своїм внутрішнім класам цілодобово, або налаштовували AOSP на нескінченність. Для мене це рішення вирішує проблему необхідності перевизначення та включення тонн спеціального вмісту AOSP І пов'язаних приватних асоціацій лише задля того, що пуристи вважають чистим. Чи знали ви, що не можете послідовно примусово використовувати FASTSCROLL для невеликих списків? Перш ніж я використовував роздуми, це вимагало від мене копіювання 10+ ресурсів AOSP для редагування ONE char.
leRobot

54

Панель дій

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, це правда: "Якщо на вашому пристрої є кнопка меню, значок переповнення не відображатиметься".
Ahmad Dwaik 'Warlock'

Я тестую на пристрої з кнопкою меню, і в моєму випадку відображається переповнення. Я використовую android:showAsAction="always"для додаткової статті
Kirit Vaghela

на якому пристрої ви його тестували? Я використовував neo v xperia та s
Ахмад Двайк "Чорнокнижник"

1
Примітка: Ваш елемент, який роздуває ваше меню переповнення, ПОВИНЕН showAsAction = "завжди"
Kirit Vaghela

1
showAsAction недоступний у просторі імен android у старих SDK. Перейдіть за цим посиланням developer.android.com/training/basics/actionbar/…, щоб подолати це. Після додавання цього NS schemas.android.com/apk/res-auto , вищезгаданий трюк для мене спрацював цілком
справно

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"

Ввола! у вас є переповнення меню! Сподіваюся, я вам допоміг. :)


3
Приємне рішення, краще, ніж зламати кнопку меню.
ol0

26

На пристроях з апаратними кнопками меню (Galaxy S3, упертий, як Samsung ...) меню переповнення поводиться як "традиційне" меню за допомогою кнопки апаратного меню.


2
Стара відповідь, проте з бібліотекою сумісності просто натрапляють на дуже дивні результати: 3 пристрої з апаратною кнопкою, Примітка 3 Neo = Меню переповнення відображається, кнопка меню не працює, Примітка 1 = Немає переповнення, кнопка меню працює, Galaxy S3, ні переповнення, кнопка меню не працює! Це божевілля.
3c71,

5

Коли ви говорите меню "переповнення", ви маєте на увазі три крапки, які з'являються в кінці, щоб вказати, що є більше елементів .... або ви маєте на увазі розділену панель дій, яка відображається внизу для елементів переповнення?

Якщо ви маєте на увазі розділений рядок дій, ви повинні додати це до файлу маніфесту своєї діяльності

android:uiOptions="splitActionBarWhenNarrow"

За замовчуванням меню переповнення трьома крапками має відбуватися автоматично, тому важко визначити, в чому проблема, за інформацією, яку ви вказали вище.


Я маю на увазі три крапки. Це не так, як через елементи, тому що при зміні елементів замовлення відображаються перші 2 піктограми
Mats Raemen

чи слід надавати додаткову інформацію, щоб визначити справжню проблему?
Mats Raemen

Які ваші minSdkVersion, targetSdkVersion і версія, яку ви тестуєте?
Sparky

5
Чи є на вашому пристрої фізичні кнопки меню, чи це віртуальні кнопки, як телефон Galaxy Nexus? Думаю, три крапки з’являться, лише якщо на вашому телефоні немає фізичних кнопок.
wnafee

5

Щоб завжди показувати переповнення дії (три крапки) на actionbarcompat:
у файлі меню, приклад:
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.


3

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

Це рішення додає кнопку переповнення до, android.support.v7.app.ActionBarщо відкриває меню стандартних параметрів лише у попередніх сотах (<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()за допомогою кнопки меню ... але якщо ви використовуєте Анотації Android, це легко зробити:

@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();
        }
    }
    );
}


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"/>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.