Android项目技术总结:项目中选择任务的联系人引出android的spinner的监听问题
2012-02-23 11:09
429 查看
web版本的项目中有这样一个功能,动态添加联系人,并且可以修改,如下图:
可以由上面四图明显可以看出web上面的联系人功能,最多可以有七个列表,每个列表选择好了以后,又可以修改,如d图。前面选择好的联系人,后面则不能选,因为没有数据。
移植到android:
我在android上想要实现这样一个功能,一个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中的语句,所以一开始便会弹出一个对话框。
后来我又想到加入boolean标志来判断是否第一次进入activity等方法,发现效果都不能达到想象中的。
可以由上面四图明显可以看出web上面的联系人功能,最多可以有七个列表,每个列表选择好了以后,又可以修改,如d图。前面选择好的联系人,后面则不能选,因为没有数据。
移植到android:
我在android上想要实现这样一个功能,一个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中的语句,所以一开始便会弹出一个对话框。
后来我又想到加入boolean标志来判断是否第一次进入activity等方法,发现效果都不能达到想象中的。
相关文章推荐
- Android项目技术总结:项目中选择任务的联系人引出android的spinner的监听问题
- Android项目技术总结:项目中选择任务的联系人android版的解决方案
- Android项目技术总结:项目中选择任务的联系人android版的解决方案
- Android学习总结一:adb的使用、打电话、Button监听两种方法、发短信、ADT23.0.2版本兼容问题
- 7-8月android项目遇到的问题总结(待详细完善)
- 最近一年做Android项目过程中,对其的一些注意事项(优化)以及问题总结(一)
- android_weex安卓端页面跳转如果装几个weex项目会弹窗选择打开 问题解决
- 关于android项目的导包问题总结
- Android 关于7.0权限相册不能选择 或者联系人不能选择的问题
- android项目开发所遇问题总结
- android 对一个合并后的联系人选择编辑,手机屏幕会缓慢变暗后再进入编辑界面的问题
- 使用Vue框架开发商城mall项目中所遇到的问题及技术点总结
- Android项目技术总结:主界面中ListView装载数据并结合手势进行翻页
- Android关于activity出现在最近任务列表的问题总结
- Android项目导入Eclipse遇到问题个人总结
- 某技术大牛的帖子(android项目总结)
- 最近一年做Android项目过程中,对其的一些注意事项(优化)以及问题总结(二)
- Android中spinner的监听问题
- 【Android Activity相关】任务栈、启动模式相关问题总结
- Android项目技术总结:获取状态栏和标题栏并计算长宽来限制绘制浮动窗口活动范围