我想要实现这样一个功能,一个Activity中有一个spinner,当我点击spinner其中的某一条的时候便弹出一个对话框。 于是我想到了setOnItemClickListener这个方法,测试发现有异常,一查源码发现:A spinner does not support item click events. Calling this method will raise an exception. 所以觉得这条路可能是走不同了。 于是我便实现了这个方法:setOnItemSelectedListener,下面是我的关键代码: taskContactsSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { AlertDialog.Builder builder = new AlertDialog.Builder(SpinnerTest.this); builder.setTitle("Contacts"); builder.setItems(mItems, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //点击后弹出窗口选择了第几项 new AlertDialog.Builder(SpinnerTest.this) .setMessage("你选择的id为" + which + " , " + mItems[which]) .show(); } }).show(); } public void onNothingSelected(AdapterView<?> arg0) { // TODO Auto-generated method stub } }); 以上代码中的onItemSelected方法里面的语句为弹出一个对话框。 测试发现:当我一进入Activity的时候,onItemSelected中的语句便自动执行了,而我要的效果是,只有当我点击spinner中的某一条的时候,才能弹出该对话框。看到网上很多人说可以setSelect(0,false)可以防止一开始进入Activity便执行onItemSelected中的语句,表面上看效果是的,但实际上这样做只是掩耳盗铃,很多人可以发现,这样做了以后打开spinner点击第一条是没有动作执行的,只有点击其他的条数在反过来点击第一条才会有反映,但是如果前后两次点击相同的条目的话,第二次的点击也是无效的,那这是为什么呢? 带着这个疑问,我又查看了源码发现:onItemSelected这个方法是当spinner中的内容有改变的时候才会触发,虽然我们表面上spinner的数据没有什么变化,但是当我们点击的条目的id变化时,其内部是看作spinner有变化的,关键代码: if (mDataChanged) { handleDataChanged(); } 既然如此,便可以解释上面的问题了,两次点击同样的条目,是没有任何动作会发生的。一开始进入Activity的时候,spinner中有了数据肯定也是变化了,所以便会执行onItemSelected中的语句,所以一开始便会弹出一个对话框。 |
Android中spinner的监听问题
最新推荐文章于 2023-05-16 17:54:24 发布