пʼятниця, 23 травня 2014 р.

Android: Spinner (Dropdown list)

     В Android спадний список Dropdown list називається Spinner. Ідея одна і та сама - відобразити список, що розгортається, з можливістю вибрати одну з опцій.




     Є два методи, щоб заповнити список:
- статично, створивши стрічковий масив string-array в файлі ресурсів res\values\strings.xml, або в окремому xml-файлі в папці values. Оскільки  string-array належить до простого типу ресурсів, то і в першому і в другому випадках для його ідентифікації буде використано значення властивості  name, а не назва xml-файлу;
- динамічно, під час виконання програми, використовуючи клас, що імплементує інтерфейс SpinnerAdapter, як наприклад ArrayAdapter, якщо дані для списку знаходиться в таблиці (може бути оголошена в тому ж таки  string-array), або CursorAdapter, якщо ми їх отримаємо з бази даних.

     В цій статті зупинюсь на статичному методі. На сайті андроїда чомусь знайшов інформацію тільки по динамічному методу. Тому з ним розібратись буде простіше, хоча для його реалізації потрібно написати кілька додаткових стрічок коду, щоб зв'язати адаптер і спінер. Потім реалізація одинакова - потрібно імплементувати інтерфейс AdapterView.OnItemSelectedListener.
  
    Зразок стрічкового масиву в strings.xml (developer.android.com):

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="planets_array">
        <item>Mercury</item>
        <item>Venus</item>
        <item>Earth</item>
        <item>Mars</item>
        <item>Jupiter</item>
        <item>Saturn</item>
        <item>Uranus</item>
        <item>Neptune</item>
    </string-array>
</resources>
     Розмір списку (кількість рядочків) ніде не вказується. Щоб додати, видалити чи змінити опцію, потрібно тільки відредагувати цей string-array (examples.javacodegeeks.com).

     В  xml-файлі для layout для віджета <Spinner /> потрібно вказати назву масиву, з якого буде отримано дані для заповнення спадного списку:

android:entries="@array/planets_array"

     Також можна додати властивість android:prompt, яка створює заголовок для списку:

 android:prompt="@string/select"

     
     Коли користувач обирає якийсь елемент зі списку, об'єкт класу Spinner може реагувати на цю  подію (on-item-selected event). Для цього потрібно реалізувати інтерфейс    AdapterView.OnItemSelectedListener, який включає два методи (так як це інтерфейс, то потрібно реалізувати обидва):
-  onItemSelected() - метод, що реагує на подію, яка викликана вибором елементу зі списку.         Викликається тільки тоді, коли новий обраний елеметн відрізняється від попереднього;
- onNothingSelected() - метод, що реагує на подію, яка виникає, коли вибір зникає зі списку. Таке може відбутися за певних умов, наприклад, коли адаптер стає пустим.

     Нижче наведено код імплементування інтерфейсу у вигляді анонімного класу:

  // оголошення змінної типу Spinner
  Spinner spinner = (Spinner) findViewById(R.id.spinner1);
  // змінна, в яку буде записано номер обраного пункту в спінері.
  int choix = 0;

// прив'язка Listner'а до оголошеного об'єкту класу Spinner.
// Для цього використано анонімний клас.
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {  
   // перший метод інтерфейсу OnItemSelectedListener
   public void onItemSelected(AdapterView<?> adapterView, 
                View view, int position, long l) 
   {                  
       choix = position;
       Toast.makeText(MainActivity.this,"Choix  : " + 
                    choix ,Toast.LENGTH_SHORT).show();
   }
   
   // другий метод інтерфейсу OnItemSelectedListener                 
   public void onNothingSelected(AdapterView<?> arg0) 
   {
      // якщо не потрібно, то тіло метода можна залишити пустим
   } 

}); // кінець анонімного класу

     Параметр int position методу onItemSelected містить позицію обраного пункту в спінері. Нумерація починається з нуля, тобто перший пункт має номер 0, другий - 1 і т.д. Щоб отримати саму стрічку, яка знаходиться в обраному пукті списку, можна використати метод класу AdapterView - getItemAtPosition(int position):

String s = adapterView.getItemAtPosition(int position);


Немає коментарів:

Дописати коментар