Я дурачился с 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.
}
}
Вот оно. Мой вопрос заключается в том, где и как реализовать прослушиватели для последовательных Spinners, чтобы они включались после выбора первого. Моя первая догадка:
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 здесь не инкапсулирован.
Затем последовательные счетчики должны выбрать массив строк для своих адаптеров в зависимости от того, какой выбор у счетчиков перед ним. Я попытался инкапсулировать спиннеры в классе активности, в конструкторе, но приложение вылетает перед запуском.
Заранее большое спасибо за вашу помощь.