Android项目技术总结:项目中选择任务的联系人引出android的spinner的监听问题
web版本的項(xiàng)目中有這樣一個(gè)功能,動(dòng)態(tài)添加聯(lián)系人,并且可以修改,如下圖:???
???????????????????????????????????????????????
可以由上面四圖明顯可以看出web上面的聯(lián)系人功能,最多可以有七個(gè)列表,每個(gè)列表選擇好了以后,又可以修改,如d圖。前面選擇好的聯(lián)系人,后面則不能選,因?yàn)闆]有數(shù)據(jù)。??????????????????????
????
移植到android:
我在android上想要實(shí)現(xiàn)這樣一個(gè)功能,一個(gè)Activity中有一個(gè)spinner,當(dāng)我點(diǎn)擊spinner其中的某一條的時(shí)候便彈出一個(gè)對話框。
于是我想到了setOnItemClickListener這個(gè)方法,測試發(fā)現(xiàn)有異常,一查源碼發(fā)現(xiàn):A spinner does not support item click events. Calling this method will raise an exception. 所以覺得這條路可能是走不同了。
于是我便實(shí)現(xiàn)了這個(gè)方法:setOnItemSelectedListener,下面是我的關(guān)鍵代碼:
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) {
?? ??? ??? ????????????????????? //點(diǎn)擊后彈出窗口選擇了第幾項(xiàng)
?? ??? ??? ????????????????????? new AlertDialog.Builder(SpinnerTest.this)
?? ??? ??? ????????????????????? .setMessage("你選擇的id為" + which + " , " + mItems[which])
?? ??? ??? ????????????????????? .show();
?? ??? ??? ???????????????? }
?? ??? ??? ???????????? }).show();
?? ??? ??? ?}
?? ??? ??? ?public void onNothingSelected(AdapterView<?> arg0) {
?? ??? ??? ??? ?// TODO Auto-generated method stub
?? ??? ??? ??? ?
?? ??? ??? ?}
?? ??? ?});
以上代碼中的onItemSelected方法里面的語句為彈出一個(gè)對話框。
測試發(fā)現(xiàn):當(dāng)我一進(jìn)入Activity的時(shí)候,onItemSelected中的語句便自動(dòng)執(zhí)行了,而我要的效果是,只有當(dāng)我點(diǎn)擊spinner中的某一條的時(shí)候,才能彈出該對話框。看到網(wǎng)上很多人說可以setSelect(0,false)可以防止一開始進(jìn)入Activity便執(zhí)行onItemSelected中的語句,表面上看效果是的,但實(shí)際上這樣做只是掩耳盜鈴,很多人可以發(fā)現(xiàn),這樣做了以后打開spinner點(diǎn)擊第一條是沒有動(dòng)作執(zhí)行的,只有點(diǎn)擊其他的條數(shù)在反過來點(diǎn)擊第一條才會(huì)有反映,但是如果前后兩次點(diǎn)擊相同的條目的話,第二次的點(diǎn)擊也是無效的,那這是為什么呢?
帶著這個(gè)疑問,我又查看了源碼發(fā)現(xiàn):onItemSelected這個(gè)方法是當(dāng)spinner中的內(nèi)容有改變的時(shí)候才會(huì)觸發(fā),雖然我們表面上spinner的數(shù)據(jù)沒有什么變化,但是當(dāng)我們點(diǎn)擊的條目的id變化時(shí),其內(nèi)部是看作spinner有變化的,關(guān)鍵代碼:
?if (mDataChanged) {
??????????? handleDataChanged();
??????? }
既然如此,便可以解釋上面的問題了,兩次點(diǎn)擊同樣的條目,是沒有任何動(dòng)作會(huì)發(fā)生的。一開始進(jìn)入Activity的時(shí)候,spinner中有了數(shù)據(jù)肯定也是變化了,所以便會(huì)執(zhí)行onItemSelected中的語句,所以一開始便會(huì)彈出一個(gè)對話框。
后來我又想到加入boolean標(biāo)志來判斷是否第一次進(jìn)入activity等方法,發(fā)現(xiàn)效果都不能達(dá)到想象中的。
轉(zhuǎn)載于:https://www.cnblogs.com/duancanmeng/archive/2012/02/23/2524640.html
總結(jié)
以上是生活随笔為你收集整理的Android项目技术总结:项目中选择任务的联系人引出android的spinner的监听问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ae怎么做手写文字的动画? AE文本文字
- 下一篇: Win11下载软件被阻止怎么办 Win1