【问题标题】:Enable a currently disabled Spinner in Android在 Android 中启用当前禁用的 Spinner
【发布时间】: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 类的构造函数中,但应用程序在运行前崩溃了。

非常感谢您的帮助。

【问题讨论】:

    标签: java android spinner


    【解决方案1】:

    使用onItemSelectedview 参数来决定哪个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
    }
    

    【讨论】:

    • 嘿,谢谢!只是为了澄清一下,您的意思是为所有三个 Spinner 实现一个侦听器,只在侦听器内部进行测试以查看它来自哪个 Spinner?
    • 非常抱歉,您能否更详细地解释一下您将如何实现此功能?我很迷茫。再次感谢!
    • 是的,你需要一个监听器来监听所有三个微调器。
    • 谢谢,如果您不介意的话,我会很感激关于如何准确使用视图参数来拉取 Spinner 发送事件的进一步指示!干杯。
    • 啊哈我明白你的意思了,非常感谢,我会试一试的!
    【解决方案2】:

    尝试使用这个:

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

    祝你好运!

    【讨论】: