Intereting Posts
Где сообщить об ошибках устройства для Samsung? Как запретить AndroidStudio открывать LogCat (вкладку) при нажатии «Выполнить»? Пример полнотекстового поиска в Android Используйте как onClickListener, так и onLongClickListener в списке Android 1.6. Я не могу установить / запустить Android Studio для Windows 7 64 бит Android создает spinner с элементами, которые имеют скрытое значение и отображают некоторый текст? Как getPackageManager в фрагменте Android Устаревший метод, но для замены метода требуется более высокий api Ящик навигации: как установить выбранный элемент при запуске? Использование Alarmmanager для запуска службы в определенное время Создание пользовательского ПЗУ в Android Проблема с подключением к Интернету в Интернете Рекурсия, вызывающая mutableData.setValue (), вызывающая создание одной и той же активности в backstack? Поделиться счетом на Facebook android PhoneGap – клавиатура делает экран черным и мерцающим в течение некоторого времени на Samsung Galaxy Tab 10.1

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

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

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

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

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

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

Solutions Collecting From Web of "Меню переполнения команды в ActionBarSherlock"

Если вы используете версию 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 в "@style/Theme.SociallyYOU" manifest.xml , я использую это как атрибут: "@style/Theme.SociallyYOU"

Опять же, если вы должны полностью принудительно переполнить, вы также можете прочитать мнение CommonsWare по этому вопросу в другом вопросе: https://stackoverflow.com/a/12872537/450534 .

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

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

  1. Чтобы заставить видимость меню для Android 3.x (сотовый) и верхний, вам нужно использовать эту версию взлома + добавить версию 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 
  2. Откройте меню для устройств с предварительной сотой:

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

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

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

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

       @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.

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

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

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

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

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

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

Что-то подобное происходит с задней клавишей. На некоторых устройствах может быть обратный ключ HW, но более новые, как правило, нет. Но когда мы можем вернуться в наши приложения, мы всегда показываем эту стрелочную кнопку в панели действий, верно? И да, я знаю, что одна кнопка перемещается назад в «навигационном дереве», а другая идет «назад во времени», но это также еще один недостаток дизайна: для среднего пользователя назад только что вернулся. У него есть эта кнопка на экране, и он также может использовать 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.

Я нахожу, что ответ Exterminator13 не работает на каких-либо устройствах Android (общее число, на которое я думаю, довольно мало), но чтобы оно было максимально возможным для всех устройств, я использую диалог и использую одно меню с Android: showAsAction = "always" Как кнопка переполнения меню. В конце концов, эффект меню переполнения 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(); }