Spinner с иконкой

от
Android   view, spinner

Понадобилось мне сделать выпадающее меню, чтобы оно выпадало при нажатии на картинку (примерно такое ). Это можно сделать с помощью ActionProvider, но мне это не подходило, т.к. он может располагаться только в actionbar.

    Есть еще виджет Spinner. Он полностью подходит для данной задачи, но вместо картинки, отображается выбранный пункт меню. После неудачных попыток написать свой аналог Spinner`a было найдено простое решение:
  1. package ua.naiksoftware.widget;
  2.  
  3. import android.content.Context;
  4. import android.util.TypedValue;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.BaseAdapter;
  8. import android.widget.ImageButton;
  9. import android.widget.SpinnerAdapter;
  10. import android.widget.TextView;
  11.  
  12. /**
  13.  *
  14.  * @author Naik
  15.  */
  16. public class IconSpinnerAdapter extends BaseAdapter implements SpinnerAdapter {
  17.  
  18.     private final String[] values;// пункты меню
  19.     private final Context context;
  20.     private final ImageButton icon;// картинка, при нажатии на кот. раскрывается\закрыв. меню
  21.  
  22.     public IconSpinnerAdapter(String[] values, Context context) {
  23.         this.values = values;
  24.         this.context = context;
  25.         icon = new ImageButton(context);
  26.         icon.setImageResource(android.R.drawable.ic_menu_more);
  27.         icon.setClickable(false);// чтобы кнопка не перехватывала на себя нажатия
  28.     }
  29.  
  30.     @Override
  31.     public int getCount() {
  32.         return values.length;
  33.     }
  34.  
  35.     @Override
  36.     public Object getItem(int position) {
  37.         return values[position];
  38.     }
  39.  
  40.     @Override
  41.     public long getItemId(int position) {
  42.         return position;
  43.     }
  44.  
  45.     @Override
  46.     public View getView(int position, View convertView, ViewGroup parent) {
  47.          return icon;
  48.     }
  49.  
  50.     @Override
  51.     public View getDropDownView(int position, View convertView, ViewGroup parent) {
  52.         TextView textView = (TextView) View.inflate(context, android.R.layout.simple_spinner_dropdown_item, null);
  53.         textView.setText(values[position]);
  54.         textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
  55.         textView.setPadding(10, 5, 10, 5);
  56.         return textView;
  57.     }
  58. }

Остается использовать этот адаптер в Spinner:
  1. @Override
  2.     public void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.  
  5.         setContentView(R.layout.my_layout);
  6. //...
  7.         Spinner spinnerMenu = (Spinner) findViewById(R.id.spinner_menu);
  8.         spinnerMenu.setAdapter(new IconSpinnerAdapter(getResources().getStringArray(R.array.test_arr), this));
  9.         spinnerMenu.setBackground(null);
  10.         spinnerMenu.setPadding(0, 0, 0, 0);
Вот так это меню выглядит
  Screenshot_2014-07-03-14-53-28.png
+8   8   0
1937