【发布时间】:2025-12-06 19:10:01
【问题描述】:
我在玩 Android,我的 Java 知识充其量是有限的(例如,我对它允许内联类这一事实感到困惑!?)。
我的问题如下:
我有一个布局,其中包含三个下拉菜单。我在 onCreate() 中初始化了这三个。
第一个从字符串数组中获取值。但是第二个取决于第一个的选择,第三个取决于第二个的选择!
我有一些用于第二个 Spinner 的字符串数组,但我想知道实现连续启用的 Spinner 列表的正确方法是什么。我很想破解它并让它工作,但我不想冒它畸形和不稳定的风险。
因此,例如,我的情况是,我的 Google Spinner tutorial 好像每个行星的卫星都有一个额外的 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 实现侦听器,以便在选择第一个 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 没有封装在这里。
然后,连续的微调器应该为它们的适配器选择一个字符串数组,这取决于之前微调器的选择。我尝试将微调器封装在 Activity 类的构造函数中,但应用程序在运行前崩溃了。
非常感谢您的帮助。
【问题讨论】: