Выпадающий Spinner за пределами панели действий? (в стиле IceCream Sandwich, с ActionBarSherlock)

Есть ли способ создать Dropdown Spinner для Android 2.3.3? Я использую ActionbarSherlock.

Вот пример того, что я имею в виду:

введите здесь описание изображения

Спасибо


person Ahmad    schedule 25.04.2012    source источник
comment
Как насчет выпадающего списка Spinner, который существует со времен API 1? Темы могут быть разными, но вы сможете скопировать большую их часть в пользовательскую тему.   -  person Sam    schedule 26.04.2012
comment
Он имеет в виду внешний вид счетчиков ICS, где они раскрываются, а не являются диалогом.   -  person dmon    schedule 26.04.2012


Ответы (2)


Как говорится, вам повезло. Это можно сделать с помощью ActionBarSherlock, и он работает с версиями до 4.0. Тем не менее, я не уверен на 100%, что Джейк Уортон захочет, чтобы мы использовали его таким образом, поскольку это не совсем «общедоступный API», насколько я знаю (я хотел спросить). В любом случае, вы должны сначала создать свой собственный класс, расширяющий класс ActionBarSherlock:

public class MyIcsSpinner extends IcsSpinner {

  public MyIcsSpinner(Context context, AttributeSet attrs) {
    super(context, attrs, com.actionbarsherlock.R.attr.actionDropDownStyle);

  }

  public MyIcsSpinner(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

  }
}

Чтобы включить его в макет:

<com.blah.blah.blah.MyIcsSpinner
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_gravity="center"
    android:textAllCaps="true"
    android:background="@drawable/abs__spinner_ab_holo_light"
    android:textColor="#000000"
    android:gravity="center"/>

Теперь вам нужно создать собственный SpinnerAdapter, и вам нужно переопределить следующие методы, чтобы получить правильный внешний вид:

@Override
  public View getView(int position, View convertView, ViewGroup parent) {
    final TextView filterName;
    if (convertView == null) {
      filterName = (TextView) layoutInflater.inflate(R.layout.filter_item, parent, false);
    } else {
      filterName = (TextView) convertView;
    }

    filterName.setText(getItem(position));
    return filterName;
  }

  @Override
  public View getDropDownView(int position, View convertView, ViewGroup parent) {
    final TextView filterName;
    if (convertView == null) {
      filterName = (TextView) layoutInflater.inflate(R.layout.sherlock_spinner_dropdown_item, parent, false);
      filterName.setEllipsize(TruncateAt.END);
    } else {
      filterName = (TextView) convertView;
    }

    filterName.setText(getItem(position));
    return filterName;
  }

YMMV, особ. относительно тем.

person dmon    schedule 25.04.2012
comment
@dmon Ширина раскрывающегося списка не меняется после поворота устройства. Не могли бы вы предложить по этому поводу? - person Ramesh Akula; 07.07.2014

Я столкнулся с той же проблемой, и мое решение довольно простое. (Я не использовал HoloEverywhere.)

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

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    SubMenu sub = menu.addSubMenu("More");
    sub.getItem().setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
    sub.getItem().setIcon(R.drawable.ic_menu);

    getSupportMenuInflater().inflate(R.menu.activity_main, sub);

    return true;
}

Поскольку меню «Дополнительно» не имеет атрибута MenuItem.SHOW_AS_ACTION_WITH_TEXT, слово «Дополнительно» (или как вы его назвали) фактически не будет отображаться на панели действий. Единственная отображаемая иконка R.drawable.ic_menu может быть скопирована из папки res/drawable-xxdpi исходного кода ABS с именем «abs__ic_menu_moreoverflow_normal_holo_dark.png», что является так называемой трехточечной иконкой. А R.menu.activity_main — это ваше меню xml.

Оно работает!

person Yingyi Xu    schedule 17.05.2013