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