Включить отключенный Spinner в Android - PullRequest
1 голос
/ 04 августа 2010

Я дурачился с Android, и мои знания Java в лучшем случае ограничены (например, я озадачен тем фактом, что он допускает встроенные классы!?).

Мой вопрос таков:

У меня есть макет, в котором есть три выпадающих меню. Я инициализирую все три из них внутри onCreate ().

Первый берет свои значения из строкового массива. Второй, однако, зависит от выбора первого, а третий зависит от выбора второго по очереди!

У меня есть несколько строковых массивов для второго Spinner, но мне было интересно, как будет правильно реализовать список последовательно включенных Spinner. Я испытываю желание просто взломать его и заставить его работать, но я не хочу рисковать, чтобы он был уродливым и нестабильным.

Итак, ради примера, у меня такой случай, как будто у меня есть урок Google Spinner с дополнительным Spinner для лун каждой планеты (а затем, возможно, для кратеров на каждой из лун).

В моих ресурсах у меня есть arrays.xml, такой как:

<resources>

<string-array name="planets">
    <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>
<string-array name="earth">
    <item>The Moon</item>
</string-array>
<string-array name="mars">
    <item>Deimos</item>
    <item>Phobos</item>
</string-array>
<string-array name="jupiter">
    <item>Metis</item>
    <item>Adrasthea</item>
    <item>Amalthea</item>
    <item>Thebe</item>
    <item>Io</item>
    <item>Europa</item>
    <item>Ganymede</item>
    <item>Callisto</item>
 [...] etc. etc. 
</resources>

В методе onCreate я инициализирую все три:

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  Spinner spinner1 = (Spinner) findViewById(R.id.planetSpinner);
  Spinner spinner2 = (Spinner) findViewById(R.id.moonSpinner);
  Spinner spinner3 = (Spinner) findViewById(R.id.craterSpinner);
  spinner2.setEnabled(false);
  spinner3.setEnabled(false);
  ArrayAdapter adapter1 = ArrayAdapter.createFromResource(
        this, R.array.planets, android.R.layout.simple_spinner_item);
  adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  spinner1.setAdapter(adapter1);
  spinner1.setOnItemSelectedListener(new MyOnPlanetSelectedListener());

}

Мой класс слушателя

public class MyOnPlanetSelectedListener implements OnItemSelectedListener {

public void onItemSelected(AdapterView<?> parent,
    View view, int pos, long id) {
  Toast.makeText(parent.getContext()), "The planet is " +
      parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
 }

public void onNothingSelected(AdapterView parent) {
  // Do nothing.
  }
}

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

    public class MyOnPlanetSelectedListener implements OnItemSelectedListener {

public void onItemSelected(AdapterView<?> parent,
    View view, int pos, long id) {
  Toast.makeText(parent.getContext()), "The planet is " +
      parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();

  spinner2.setEnabled(true);

 }

public void onNothingSelected(AdapterView parent) {
  // Do nothing.
  }
}

Но, очевидно, это неправильно, так как spinner2 здесь не инкапсулирован.

Затем последовательные счетчики должны выбрать массив строк для своих адаптеров в зависимости от того, какой выбор спиннеров перед ним. Я попытался инкапсулировать счетчики в классе активности, в конструкторе, но приложение запускается до запуска.

Заранее большое спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 05 октября 2010

Попробуйте использовать это:

    switch(parent.getId())
    {
    case R.id.spinner1:
        Log.d(TAG,"spinner1");
        break;
    case R.id.spinner2:
        Log.d(TAG,"spinner2");
         break;

    }

удачи!

1 голос
/ 04 августа 2010

Используйте параметр view onItemSelected, чтобы решить, какой Spinner отправил событие onItemSelected.Отсюда логика проста:

Сделать spinner1 2 и 3 членом класса (деятельность)

private Spinner spinner1;

Затем просто сравните параметр view с

if (view==this.spinner1) {
   // event came from spinner 1
   // create a new adapter, assign the new adapter to spinner 2
} else if (view==this.spinner2) {
   // event came from spinner 2
}
...