在Android中启用当前禁用的Spinner

时间:2010-08-04 07:11:44

标签: java android spinner

我一直在玩Android,我的Java知识最多也是有限的(例如,我对它允许内联类这一事实感到困惑!?)。

我的问题如下:

我有一个布局,其中有三个下拉菜单。我在onCreate()中初始化了所有这三个。

第一个从字符串数组中获取其值。然而,第二个取决于第一个的选择,第三个取决于第二个的选择!

我为第二个Spinner提供了一些字符串数组,但我想知道实现连续启用的Spinners列表的正确方法是什么。我很想进入它并让它发挥作用,但我不想冒这个变形和不稳定的风险。

所以,例如,我的情况就好像我的Google Spinner tutorial有一个额外的旋转器,用于每颗行星的卫星(然后可能是每个卫星上的陨石坑)。

在我的资源中,我有一个array.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没有封装在这里。

然后,连续的微调器应该为它们的适配器选择一个字符串数组,具体取决于之前旋转器的选择。我尝试在构造函数中将spinners封装在activity类中,但应用程序在运行之前崩溃。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

使用view的{​​{1}}参数来决定哪个Spinner发送了onItemSelected个事件。从这一点来看,逻辑很简单。

创建类的spinner1 2和3成员(活动)

onItemSelected

然后只需将private Spinner spinner1; 参数与

进行比较
view

答案 1 :(得分:1)

尝试使用它:

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

    }
祝你好运!