1

我有一个意图启动的活动,页面上有许多微调器。我刚刚按照本指南设置了微调器的 ItemSelected 侦听器。问题是,每个 Spinner 中的第一个项目基本上是“请选择”,所以它不是一个空白框:所以我的 ItemSelected 侦听器检测到请选择在微调器中的事实,并且似乎假设它被选中而不是加载默认。理想情况下,我希望听众只检测到何时做出了实际选择。忽略默认选择的最佳方法是什么?

以下是相关代码:

    ageSpinner = (Spinner) findViewById(R.id.ageSpinner);
    ageAdapter = ArrayAdapter.createFromResource
    (this, R.array.ageArray, android.R.layout.simple_spinner_item);
    ageAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    ageSpinner.setAdapter(ageAdapter);
    ageSpinner.setOnItemSelectedListener(new MyOnItemSelectedListener());

public class MyOnItemSelectedListener 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.
    }
}
4

4 回答 4

1

问题是选择是在第一个布局阶段完成的。所以第一次计算你的布局时,Spinnerraises onItemSelected。它很烦人,但它的工作方式。您可以尝试几种不同的方法,但鉴于您已经有Please Select Something项目,您能做的最好的事情就是在所选项目为 0 时忽略该事件。

于 2012-05-19T02:43:43.467 回答
1

将布尔值设置为 false,在 onItemSelected 中对其进行检查,如果为 false,则将其设置为 true,并且不执行任何其他操作。下次,当它是真的时,照常做。

于 2012-05-18T22:09:10.110 回答
1

这里有很多可能的方法。例如,您可以覆盖Spinner使用反射的正常行为,或者简单地切换到Button模仿 a Spinner,单击它会弹出一个AlertDialog.

但是,其他解决方案可以更容易实施。Barak 命名了一个,而另一种方法是简单地检查 中的选定位置Spinner,假设“请选择”将始终是第一项(因此,在 position 处0)并且您没有对这些项目进行任何排序。

我相信您会找到适合您的问题的一种可能性,但也许您还可以详细说明为什么它的问题onItemSelected(...)会因初始选择而被解雇?

于 2012-05-19T02:35:06.973 回答
0

OP的解决方案。

public class MyOnItemSelectedListener implements OnItemSelectedListener {

    public void onItemSelected(AdapterView<?> parent,
        View view, int pos, long id) {
        if (pos != 0) {
        //this if makes sure it ignores 0, which is 
            //Please Select in the drop down    
      Toast.makeText(parent.getContext(), parent.getTag().toString() +
          parent.getItemAtPosition(pos).toString(), Toast.LENGTH_LONG).show();
        }
    }

    public void onNothingSelected(AdapterView parent) {
      // Do nothing.
    }
}
于 2018-07-15T18:26:32.540 回答