当前位置:操作系统 > 安卓/Android >>

利用ListActivity,CursorAdapter获取用户输入(短信群发器的地址输入实现)总结

这两天在做一个短信群发器,在用ListActivity和CursorAdapter罗列联系人并记录用户输入时遇到了一些麻烦,解决过程颇为繁琐,深深感到Android API之广、杂的同时也让自己能静下心来谨慎编码仔细调试广泛查阅,现将最终成果和各种问题以及相应解决方法一一罗列,作为这两日的工作总结的同时,希望能给各位带来一些帮助。
    先说明下这个模块要实现的功能吧,此模块主要为群发短信的地址输入模块,用户可以在EditText中直接输入地址,也可以从联系人中pick多个电话号码。
    遇到的主要问题有:
    1.为了实现两种输入方式(直接EditText输入和联系人选择输入),创建了一个从联系人选择电话号码的ListActivity,为了能在地址编辑Activity和ListActivity之间切换而不丢失已经编辑了的电话号码,就得创建一种数据结构来保存这些电话号码,我这里使用的是一个LinkedList(具体结构后面再阐述),但是怎么样才能保证每次切换都能正确保存地址数据而且EditText内容与地址数据结构保持一致呢?!解决方法是在每次Activity切换时都先进行一次解析或提取过程:从EditText切换到ListActivity之前读取EditText的字符串内容并分析获得地址数据保存到LinkedList中,从ListActivity切换到Activity之前解析LinkedList内容获取要在EditText中显示的字符串内容。
    2.有些联系人的号码不止一个,那么应该如何对待?这里我选择的方式和我的Android 2.3系统自带的短信发送器不一样,系统自带的在从联系人获取号码时,如果联系人的号码多于1个,会弹出一个对话框让用户选择一个号码,而我选择的时对话框让用户选择多个号码。
    3.对话框与主Activity之间的通信问题,如何让对话框保存用户选择给Activity使用?这里我的解决方式是用静态变量和final变量,从内部类中调用这些变量。
    4.用户从对话框选择号码后,如何更新ListActivity的显示内容?我的解决方法是用Handler,对话框给Handler发送消息,Handler使ListActivity更新界面,更新方法为调用Cursor的requery方法。
    还有几个比较小的问题,比如联系人数据库的内容,ListActivity中CheckBox的绘制等,就不一一列举了。
    现附上我的代码(代码上还有很多清晰的改动以及调试痕迹,呵呵):
a.短信编辑Activity

[java]
/*
 * this Activity is created for sending message
 * users would edit sms message body in the EditText message , and destinations in the EditText receivers
 * there can be more than one destinations , and they are arranged at a strict layout
 * the phone number of every destination would be a String of digits , and they are separated by ','
 * and the spaces in the string are all ignored
 * a valid destinations description is like this : 1234 ,1254,1 3 52,6528,
 * 
 */ 
package com.tobacco.activity; 
 
import java.util.ArrayList; 
 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
 
import com.tobacco.pro.R; 
import com.tobacco.sms.SMSSender; 
 
public class EditMessAct extends Activity implements OnClickListener{ 
    private Button findContacts; 
    private Button send; 
    private EditText receivers; 
    private EditText message; 
    private ArrayList<String> dest; 
    private static final char SEPARATE=','; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.editmessage); 
        init(); 
    } 
    private void init(){ 
        findContacts=(Button)findViewById(R.id.contacts); 
        send=(Button)findViewById(R.id.send); 
        receivers=(EditText)findViewById(R.id.receivers); 
        message=(EditText)findViewById(R.id.messagetext); 
        findContacts.setOnClickListener(this); 
        send.setOnClickListener(this); 
        dest=new ArrayList<String>(); 
    } 
    @Override 
    public void onClick(View v) { 
        // TODO Auto-generated method stub 
        Intent i; 
        if(v==findContacts){ 
            refreshDest(); 
            i=new Intent(this,ListContactAct.class); 
            this.startActivityForResult(i,1); 
        } 
        else if(v==send){ 
            refreshDest(); 
            String t=message.getText().toString(); 
            new SMSSender(t,dest).send(); 
        } 
         
    } 
     
    @Override 
    protected void onActivityResult(int request,int result,Intent intent){ 
        super.onActivityResult(request,result,intent); 
        int t=ListContactAct.selectedReceiver.size(); 
        int i=0; 
        int k=0; 
        int p,j; 
        boolean mark; 
        //String str=""; 
        for(i=0;i<t;i++){ 
            //str=str+ListContactAct.selectedReceiver.get(i).phoneNumber+";"; 
            p=ListContactAct.selectedReceiver.get(i).phoneNumber.size(); 
            for(k=0;k<p;k++){ 
                mark=true; 
                for(j=0;j<dest.size();j++){ 
                    if(ListContactAct.selectedReceiver.get(i).phoneNumber.get(k).equals(dest.get(j))){ 
                        mark=false; 
                    } 
      &nbs

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,