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

Меню переполнения команды в ActionBarSherlock

Я хочу, чтобы меню переполнения 4.0+ использовалось на предварительных устройствах ICS (2.3 - 2.1). Я использую HoloEverywhere с ActionBarSherlock.

Я попробовал следующее решение:

ActionBarSherlock и HoloEverywhere - принудительное переполнение?

но это не работает, потому что absForceOverflow не существует. Был ли он удален в новейшей версии или что-то в этом роде? Я проверил файлы R обоих проектов библиотеки ABS и HE, и этого поля просто нет.

Моя тема приложения установлена ​​на @style/Holo.Theme.Sherlock.Light, и это тема, которую я пытался наследовать, и добавить параметр absForceOverflow в true.

4b9b3361

Ответ 1

Если вы используете версию 4.2.0, темы .ForceOverflow фактически удалены.

Источник: Версия 4.2.0 Список изменений

Извлечение журнала изменений:

Add SearchView widget for standard search interaction (API 8+ only)
Fix: ShareActionProvider in the split action bar no longer fills the entire screen.
Fix: ShareActionProvider now does file I/O on a background thread.
Fix: Automatically correct ColorDrawable not respecting bounds when used as a stacked background.
Fix: Ensure fragments collection is present before dispatching events.
Fix: XML-defined onClick searches the correct context for the declared method.
Fix: Ensure action mode start/finish callbacks are invoked on the activity for the native action bar.
Fix: Allow tab callbacks to have a fragment transaction instance for any FragmentActivity.
Fix: Ensure CollapsibleActionView callbacks are dispatched in both native and compatbility action bars.
Fix: Remove .ForceOverflow themes. These never should have been included.

Если вам абсолютно необходимо принудительно переполнить, вам нужно будет загрузить более раннюю версию ABS. Вы можете получить список загрузок в соответствии с их историей выпуска здесь: http://actionbarsherlock.com/download.html

Я лично все еще использую версию ABS 4.1.0, так как в настоящее время я не хочу делать дополнительные изменения в своем приложении. Я также использую это в своем theme.xml:

<style name="MyTheme" parent="@style/Theme.Sherlock.ForceOverflow">
    <item name="android:windowBackground">@color/background</item>
    <item name="actionBarStyle">@style/Widget.Styled.ActionBar</item>
    <item name="android:actionBarStyle">@style/Widget.Styled.ActionBar</item>
</style>

<style name="MyTheme.ForceOverflow">
    <item name="absForceOverflow">true</item>
</style>

И при применении темы для Activity в manifest.xml, я использую это как атрибут: "@style/Theme.SociallyYOU"

Опять же, если вы должны полностью переполнить поток, вы также можете прочитать CommonsWare по этому вопросу в другом вопросе: fooobar.com/questions/200842/....

ПРИМЕЧАНИЕ.. Говоря об этом, всегда лучше использовать последнюю версию, если компромиссы не критичны. Опубликуя, как я принудительно переполняю меню, я не предлагаю использовать более старую версию и не рекомендую ее. Это просто информирует вас о возможностях.

Ответ 2

Начиная с ActionbarSherlock 4.2 мы потеряли возможность управлять видимостью меню переполнения. Чтобы заставить его работать, вам нужно комбинировать 2 подхода:

  • Чтобы настроить видимость меню для Android 3.x(сотовый) и верхний, вам нужно использовать this hack + add check Версия для Android:

    public static final int DEVICE_VERSION   = Build.VERSION.SDK_INT;
    public static final int DEVICE_HONEYCOMB = Build.VERSION_CODES.HONEYCOMB;
    if (DEVICE_VERSION >= DEVICE_HONEYCOMB)
        // Code from answer above
    
  • Откройте меню для предварительно сотовых устройств:

    • Откройте ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java, перейдите к методу reserveOverflow
    • Замените оригинал на:

      public static boolean reserveOverflow (контекст контекста) {   return true; }

    Это заставит меню показывать...

    • но при нажатии на кнопку меню не появляется всплывающее меню. Для этого нам нужно переопределить это в классе activity:

      @Override
      public boolean onKeyUp(int keyCode, KeyEvent event) {
          if (DEVICE_VERSION < DEVICE_HONEYCOMB) {
              if (event.getAction() == KeyEvent.ACTION_UP &&
                  keyCode == KeyEvent.KEYCODE_MENU) {
                  openOptionsMenu();
                  return true;
              }
          }
          return super.onKeyUp(keyCode, event);
      }
      

После этих действий у вас должно быть абсолютно рабочее меню панели действий переполнения для всех версий Android.

Ответ 3

Как Сиддхарт Леле указал, он был удален в последней версии ABS, чтобы вести себя так же, как фактическая панель действий. Поэтому на первый взгляд отказ от показа этого меню - лучший вариант.

Однако, на мой взгляд, меню переполнения, отображаемое на экране для некоторых устройств и не отображающее других, является большим недостатком дизайна в Android Action Bar. Вот почему:

В устройствах с аппаратной клавишей меню меню не отображается в панели действий. Тенденция в большинстве последних устройств заключается в том, чтобы уменьшить количество кнопок HW до минимума, поскольку считается более удобным (и потому, что у iphones нет кнопки, поэтому они копируют этот проект). Другие производители включают в себя кнопку меню, но она скрыта, если вы не нажмете на нее (да, она загорается, когда вам больше не нужен свет. Не мудрый дизайн, но опять же, когда все кнопки выключены, телефон выглядит более iphonish).

Чтобы лучше понять последствия этого, давайте посмотрим пример: Пользователь A имеет устройство с клавишей меню. Он использует свой любимый почтовый клиент. Параметры для настройки почтовых учетных записей размещаются в меню переполнения, а также обычные параметры (справка, информация и т.д.). Он хотел бы добавить вторую учетную запись, но у него нет подсказки о том, как добраться до этого меню. На экране нет информации, чтобы помочь ему понять, что делать. Поэтому пользователь A спрашивает своего друга B, который также использует этот почтовый клиент. Пользователь B имеет новейший Nexus N + 1 Googlephone, и он может просматривать значок переполнения на панели действий, потому что его устройство не имеет клавиши меню HW. Он показывает A, как он может добавить вторую учетную запись, открыв это меню. Пользователь A теперь полностью запутан, так как использует одни и те же версии приложений. Смущенный, A может подумать, что проблема в его телефоне за то, что он слишком стар. B также запутан.

На этом этапе вы можете подумать, что оба A и B - дураки, которые не могут понять, как использовать смартфон. Но, в отличие от настольных приложений, подавляющее большинство пользователей смартфонов не знают, а основы об их устройствах. Их предыдущий телефон вполне мог быть клавиатурным устройством с простой прошивкой. Батарея сработала, и они пошли в магазин для замены, но это было на складе. Они могли заказать один в Интернете, но это было дороже, чем покупка нового телефона. Таким образом, им был продан телефон с поддержкой сенсорного экрана, потому что это то, как телефоны в настоящее время. Теперь им приходится сталкиваться с небольшим компьютером с полноценной ОС. Чтобы все ухудшилось, телефон приходит только с "руководством по быстрому началу", и чтобы получить полное руководство, им нужно загрузить pdf файл из Интернета. Угадай, что? Они не будут.

Если вы разрабатываете мобильное приложение, вы должны предположить, что пользователь может не знать ничего о компьютерах, ОС или подобных приложениях. Вы должны сделать GUI похожим на устройствах, чтобы люди могли узнать и запомнить, как его использовать. Не обвиняйте дизайнеров Action Bar: если пользователи, такие как A или B, не знают, как перейти в меню опций это ваша ошибка. Вот почему вы должны были включить средство для выбора экрана настроек, которое всегда отображается.

Что-то подобное происходит с задней клавишей. На некоторых устройствах может быть клавиша HW back, более новые - обычно нет. Но всякий раз, когда мы можем вернуться в наши приложения, мы всегда показываем эту стрелочную кнопку в панели действий, верно? И да, я знаю, что одна кнопка перемещается обратно в "навигационное дерево", в то время как другая идет "назад во времени", но это также еще один недостаток дизайна: для среднего пользователя спина только что вернулась. У него есть эта кнопка на экране, и он также может использовать HW, но это необязательно. То же самое должно быть сделано с меню переполнения.

Итак, если вы думаете (как я), что это важная кнопка, не сдавайтесь. Предоставить обычное главное меню параметров и заполнить его соответствующими подменю. Сделать его кнопкой действия и присвоить ему описательный значок или даже текстовое описание, например "МЕНЮ". Вы также можете имитировать значок меню переполнения, просто используйте один из этих чертежей:

    // For ActionBarSherlock
    abs__ic_menu_moreoverflow_normal_holo_dark.png
    abs__ic_menu_moreoverflow_normal_holo_light.png

    // For ActionBar
    ic_menu_moreoverflow_normal_holo_light.png
    ic_menu_moreoverflow_normal_holo_dark.png

Кроме того: перейдите и скопируйте изображения в папку res res проекта. Вы никогда не узнаете, будут ли включать в себя будущие релизы ABS или следующей реализации ActionBar.

Ответ 4

Я нахожу, что ответ Exterminator13s не работает на каких-либо устройствах Android (общее число, которое я считаю довольно небольшим), но чтобы соответствовать как можно большему количеству устройств, я использую диалог и использую одно меню с android: showAsAction = "всегда" как кнопка меню переполнения. В конце концов, эффект переполнения меню actionbarsherlock реализуется его источником, поэтому почему бы не реализовать эффект от себя, если это не так хлопотно. Если вы понимаете китайский язык, вы также можете увидеть мой блог.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/more"
        android:icon="@drawable/overflow"
        android:showAsAction="always" 
    />
</menu>

 

private Dialog popupDialog;
private Boolean popupState=false;

    public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        this.finish();
        return true;
    case R.id.more:
        if (!popupState) {
            showPop();
        }else {
            popupDialog.dismiss();
        }
    default:
        return super.onOptionsItemSelected(item);
    }
}

private void showPop(){
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(ResID, null);
    ListView listView = (ListView) view.findViewById(ResID);
    listView.setAdapter(yourOwnAdapter);
    popupDialog = new Dialog(WifiAuthWireActivity.this);
    popupDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    popupDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.WHITE));
    popupDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
    popupDialog.setContentView(view);
    // Calculate ActionBar height
    TypedValue tv = new TypedValue();
    ActionBar maActionBar=getSupportActionBar();
    int actionBarHeight=maActionBar.getHeight();
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
    {
        actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
    }
    WindowManager.LayoutParams wmlp = popupDialog.getWindow().getAttributes();
    wmlp.gravity = Gravity.TOP | Gravity.RIGHT;
    wmlp.x+=12;
    wmlp.y+=actionBarHeight;
    popupDialog.getWindow().setAttributes(wmlp);
    popupDialog.show();
}