Панель действий Android не показывает переполнение - PullRequest
90 голосов
/ 16 марта 2012

В моем приложении есть панель действий с 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;
}

Ответы [ 9 ]

125 голосов
/ 27 октября 2012

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

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());
    }
}
53 голосов
/ 12 декабря 2013

Action Bar

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

}

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

42 голосов
/ 13 февраля 2013

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

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

<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 вам нужно добавить этот код под действием, в котором вам необходимо меню переполнения. ПРИМЕЧАНИЕ: Ваш пункт, который раздувает ваше меню переполнения, ДОЛЖЕН showAsAction="always"

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

26 голосов
/ 22 июня 2012

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

5 голосов
/ 22 апреля 2015

Чтобы всегда показывать переполнение действия (три точки) на 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.

5 голосов
/ 16 марта 2012

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

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

android:uiOptions="splitActionBarWhenNarrow"

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

3 голосов
/ 07 марта 2014

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

Это решение добавляет кнопку переполнения к android.support.v7.app.ActionBar, которая открывает стандартное меню опций только перед сотой (<3.0), в противном случае она остается в системе.В любом случае вы можете выбрать между <code>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();
        }
    }
    );
}
2 голосов
/ 19 декабря 2014

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

2 голосов
/ 03 сентября 2014

Поместить 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"/>

...