1.新建名为domxml的项目

2.新建user_item.xml的自定义布局文件
1<?xml version="1.0" encoding="UTF-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability="blocksDescendants" android:gravity="center_vertical|center_horizontal" android:orientation="horizontal" > 3 4 <!--自定义的布局界面的根标签中加入了: android:descendantFocusability="blocksDescendants". --> 5 6 <TextView android:id="@+id/tv_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> 7 8 <TextView android:id="@+id/tv_phone" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> 9 10 <Button android:id="@+id/btn_call" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/btn_call" /> 11 12 <Button android:id="@+id/btn_sms" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/btn_sms" /> 13 14</LinearLayout>
字符串资源:

Graphic Layout:

3.在activity_main.xml中添加ListView控件
1<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > 2 3 <ListView android:id="@+id/lv_users" android:layout_width="match_parent" android:layout_height="match_parent" /> 4 5</RelativeLayout>
4.新建名为UserAdapter的自定义Adapter,继承BaseAdapter,注意data的存储方式
1package com.example.adapter; 2 3import java.util.List; 4import java.util.Map; 5 6import android.content.Context; 7import android.content.Intent; 8import android.net.Uri; 9import android.view.View; 10import android.view.View.OnClickListener; 11import android.view.ViewGroup; 12import android.widget.BaseAdapter; 13import android.widget.Button; 14import android.widget.TextView; 15import android.widget.Toast; 16 17import com.example.domxml.R; 18import com.example.domxml.SmsActivity; 19 20 21/** * 自定义的adapter ListAdapter * @author Administrator * */ 22public class UserAdapter extends BaseAdapter{ 23 24 //要显示的数据 25 private List<Map<String, Object>> data; 26 //接受上下文 27 private Context context; 28 29 //声明一个内部类对象 30 private ViewHolder viewHolder; 31 32 /** * 通过构造函数传递 * @param data */ 33 public UserAdapter(Context context,List<Map<String, Object>> data) { 34 this.context=context; 35 this.data=data; 36 } 37 38 //返回的总个数 39 @Override 40 public int getCount() { 41 return data.size(); 42 } 43 44 45 /** * 返回每个条目对应的数据 */ 46 @Override 47 public Object getItem(int position) { 48 // TODO Auto-generated method stub 49 return data.get(position); 50 } 51 52 /** * 返回的id 就是对应row id 和postion一致 */ 53 @Override 54 public long getItemId(int position) { 55 // TODO Auto-generated method stub 56 return position; 57 } 58 59 /** * 返回这个条目 对应控件对象 */ 60 @Override 61 public View getView(int position, View convertView, ViewGroup parent) { 62 63 System.out.println("converView@"+convertView); 64 //首先判断当前条目是否为null 65 if (convertView==null) { 66 //初始化这个viewHolder对象 67 viewHolder = new ViewHolder(); 68 //创建它 69 convertView = View.inflate(context, R.layout.user_item, null); 70 viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name); 71 viewHolder.tv_phone = (TextView) convertView.findViewById(R.id.tv_phone); 72 viewHolder.btn_call = (Button) convertView.findViewById(R.id.btn_call); 73 viewHolder.btn_sms= (Button) convertView.findViewById(R.id.btn_sms); 74 //google开发者建议使用的 75 convertView.setTag(viewHolder); 76 }else{ 77 viewHolder = (ViewHolder) convertView.getTag(); 78 } 79 80 //获取list集合中map对象 81 Map<String,Object> map = data.get(position); 82 //设置值 83 viewHolder.tv_name.setText(map.get("names").toString()); 84 final String phone = map.get("phone").toString(); 85 //设置 86 viewHolder.tv_phone.setText(phone); 87 //具体的按钮注册事件 88 viewHolder.btn_call.setOnClickListener(new OnClickListener() { 89 90 @Override 91 public void onClick(View v) { 92 Toast.makeText(context, "call---"+phone, 1).show(); 93 //执行打电话 94 //1.定义打电话的意图对象 95 Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+phone)); 96 //2.执行意图 97 context.startActivity(intent); 98 //3.记得添加打电话的权限 在项目清单中添加 99 } 100 }); 101 102 //给按钮注册事件 103 viewHolder.btn_sms.setOnClickListener(new OnClickListener() { 104 105 @Override 106 public void onClick(View v) { 107 //执行一个意图 打开发短信界面 108 //1.定义一个意图 109 Intent intent = new Intent(context,SmsActivity.class); 110 //通过这个意图可以附带数据 111 intent.putExtra("phone", phone); 112 //2.执行意图 113 context.startActivity(intent); 114 } 115 }); 116 return convertView; 117 } 118 119 120 //内部类 ViewHolder记录单个条目中所有属性 121 class ViewHolder{ 122 public TextView tv_name,tv_phone; 123 public Button btn_call,btn_sms; 124 125 } 126}
5.MainActivity.java
1package com.example.domxml; 2 3import java.io.IOException; 4import java.io.InputStream; 5import java.util.ArrayList; 6import java.util.HashMap; 7import java.util.List; 8import java.util.Map; 9 10import javax.xml.parsers.DocumentBuilder; 11import javax.xml.parsers.DocumentBuilderFactory; 12import javax.xml.parsers.ParserConfigurationException; 13 14import org.w3c.dom.Document; 15import org.w3c.dom.Element; 16import org.w3c.dom.Node; 17import org.w3c.dom.NodeList; 18import org.xml.sax.SAXException; 19 20import com.example.adapter.UserAdapter; 21 22import android.app.Activity; 23import android.content.Intent; 24import android.net.Uri; 25import android.os.Bundle; 26import android.view.View; 27import android.widget.AdapterView; 28import android.widget.AdapterView.OnItemClickListener; 29import android.widget.ListAdapter; 30import android.widget.ListView; 31import android.widget.SimpleAdapter; 32import android.widget.TextView; 33 34public class MainActivity extends Activity { 35 36 // 声明控件对象 视图V 37 private ListView lv_users; 38 // 集合 39 private List<Map<String, Object>> data = new ArrayList<Map<String, Object>>(); 40 41 @Override 42 protected void onCreate(Bundle savedInstanceState) { 43 super.onCreate(savedInstanceState); 44 setContentView(R.layout.activity_main); 45 // 获取控件对象 46 lv_users = (ListView) findViewById(R.id.lv_users); // 视图 jsp html 47 48 try { 49 // dom解析 users.xml asserts目录中 50 domParser(); 51 52 /* * context 上下文 data list集合 resource 资源布局文件 * android.R.layout.simple_list_item_2 text1 text2 * * from map集合中的key是String ids names * * to ids显示在布局文件中对应text2 names显示对应text1 */ 53 54 // 适配器 控制层 C 55 ListAdapter adapter = new UserAdapter(this, data); 56 // 设置适配器 57 lv_users.setAdapter(adapter); 58 59 // 思考 点击具体的一个条目 60 lv_users.setOnItemClickListener(new OnItemClickListener() { 61 62 @Override 63 public void onItemClick(AdapterView<?> parent, View view, 64 int position, long id) { 65 66 //获取view控件中的控件 包括用户名控件 电话的控件 67 TextView tv_name = (TextView) view.findViewById( R.id.tv_name); 68 TextView tv_phone = (TextView) view.findViewById( R.id.tv_phone); 69 //获取用户名称 70 String name = tv_name.getText().toString(); 71 //获取用户电话 72 String phone = tv_phone.getText().toString(); 73 //执行打电话 74 //1.定义打电话的意图对象 75 Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+phone)); 76 //2.执行意图 77 startActivity(intent); 78 //3.记得添加打电话的权限 在项目清单中添加 79 } 80 }); 81 82 83 84 } catch (ParserConfigurationException e) { 85 // TODO Auto-generated catch block 86 e.printStackTrace(); 87 } catch (IOException e) { 88 // TODO Auto-generated catch block 89 e.printStackTrace(); 90 } catch (SAXException e) { 91 // TODO Auto-generated catch block 92 e.printStackTrace(); 93 } 94 } 95 96 /** * 解析方法 * * @throws ParserConfigurationException * @throws IOException * @throws SAXException */ 97 private void domParser() throws ParserConfigurationException, IOException, 98 SAXException { 99 // 1.创建DocumentBuilderFactory对象 100 DocumentBuilderFactory builderFactory = DocumentBuilderFactory 101 .newInstance(); 102 // 2.通过工厂对象获取DocumentBuilder 103 DocumentBuilder builder = builderFactory.newDocumentBuilder(); 104 // 105 // 3 获取要解析的xml文件 对应的输入流 106 InputStream is = getAssets().open("users.xml"); 107 108 // 4.利用DocumentBuilder的parse方法获取解析的users.xml的document对象 109 Document document = builder.parse(is); 110 111 // 5.处理解析 112 // 1.获取文档的跟节点 users 113 Element root = document.getDocumentElement(); 114 // 2.获取当前根节点下面所有user节点的集合 115 NodeList nodeList = root.getElementsByTagName("user"); 116 117 // 遍历孩子节点 118 for (int i = 0; i < nodeList.getLength(); i++) { 119 // 获取具体的孩子节点 120 Node node = nodeList.item(i); // user 121 // 创建map对象 122 Map<String, Object> map = new HashMap<String, Object>(); 123 124 // 获取user节点的所有孩子节点 id name 125 NodeList nlist = node.getChildNodes(); 126 127 // 遍历孩子节点 128 for (int index = 0; index < nlist.getLength(); index++) { 129 // 获取具体的孩子节点 130 Node n = nlist.item(index); 131 // 判断该节点的名称是否是id 132 if (n.getNodeName().equals("id")) { 133 // 设置user的id值 134 map.put("ids", n.getTextContent()); 135 // 判断该节点的名称是否是name 136 } else if (n.getNodeName().equals("name")) { 137 // 设置name值 138 map.put("names", n.getTextContent()); 139 } else if (n.getNodeName().equals("phone")) { 140 map.put("phone", n.getTextContent()); 141 } 142 } 143 // 添加到集合中 144 data.add(map); 145 146 } 147 148 } 149 150}
6.该案例集成了发短信的功能
SmsActivity.java
1package com.example.domxml; 2 3import java.util.List; 4 5import android.app.Activity; 6import android.os.Bundle; 7import android.telephony.SmsManager; 8import android.view.View; 9import android.view.View.OnClickListener; 10import android.widget.Button; 11import android.widget.EditText; 12import android.widget.Toast; 13 14public class SmsActivity extends Activity { 15 16 private Button sendBtn; 17 private EditText etphone,etsms; 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_sms); 23 24 // 获取点击发送按钮的控件对象 25 sendBtn = (Button) findViewById(R.id.sendBtn); 26 //获取电话号码的控件对象 27 etphone=(EditText) findViewById(R.id.etphone); 28 //获取要发送信息的控件对象 29 etsms = (EditText) findViewById(R.id.etsms); 30 31 //获取这个数据 32 String phone = getIntent().getStringExtra("phone"); 33 etphone.setText(phone); 34 Toast.makeText(this, "给这个家伙发短信"+phone, 1).show(); 35 36 37 // 注册按钮的点击事件 38 sendBtn.setOnClickListener(new OnClickListener() { 39 @Override 40 public void onClick(View v) { 41 //1.获取电话号码及发送的短信内容 42 String phone = etphone.getText().toString(); 43 String content = etsms.getText().toString(); 44 //2.发短信的管理器对象 45 SmsManager smsManager = SmsManager.getDefault(); 46 //3.拆分短信内容 47 List<String> list = smsManager.divideMessage(content); 48 //4.遍历发送信息 49 for(String sms:list){ 50 //5.逐条发送短信 51 smsManager.sendTextMessage(phone, null, sms, null, null); 52 } 53 54 //5.提示短信发送成功 55 Toast.makeText(SmsActivity.this, "发短信成功", Toast.LENGTH_LONG).show(); 56 } 57 }); 58 59 60 } 61} 62 63 64Activity_sms.xml 65<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 66 xmlns:tools="http://schemas.android.com/tools" 67 android:layout_width="match_parent" 68 android:layout_height="match_parent" 69 tools:context="${relativePackage}.${activityClass}" > 70 71 <TextView 72 android:id="@+id/tvphone" 73 android:layout_width="match_parent" 74 android:layout_height="wrap_content" 75 android:text="@string/tip_phone" /> 76 77 <EditText 78 android:id="@+id/etphone" 79 android:layout_width="match_parent" 80 android:layout_height="wrap_content" 81 android:layout_below="@+id/tvphone" 82 android:inputType="phone" /> 83 84 <TextView 85 android:id="@+id/tvsms" 86 android:layout_width="match_parent" 87 android:layout_height="wrap_content" 88 android:layout_below="@+id/etphone" 89 android:text="@string/tip_sms" /> 90 91 <!-- 作业思考 怎么实现自动换行的效果 --> 92 <EditText 93 android:id="@+id/etsms" 94 android:layout_width="match_parent" 95 android:layout_height="100dp" 96 android:gravity="top" 97 android:layout_below="@+id/tvsms" 98 android:lines="5" 99 /> 100 101 <Button 102 android:id="@+id/sendBtn" 103 android:layout_width="wrap_content" 104 android:layout_height="wrap_content" 105 android:layout_below="@id/etsms" 106 android:text="@string/tip_send" /> 107 108</RelativeLayout>

7.运行效果:

点击每一个item将拨打对应条目的号码,点击发短信按钮将给对应号码发短信。
如何解决它们之间的冲突?

版权声明:本文为博主原创文章,未经博主允许不得转载。