利用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 ,