1.新建名为domxml的项目
2.新建user_item.xml的自定义布局文件
<?xml version="1.0" encoding="UTF-8"?> <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" > <!--自定义的布局界面的根标签中加入了: android:descendantFocusability="blocksDescendants". --> <TextView android:id="@+id/tv_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> <TextView android:id="@+id/tv_phone" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" /> <Button android:id="@+id/btn_call" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/btn_call" /> <Button android:id="@+id/btn_sms" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/btn_sms" /> </LinearLayout>
字符串资源:
Graphic Layout:
3.在activity_main.xml中添加ListView控件
<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}" > <ListView android:id="@+id/lv_users" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
4.新建名为UserAdapter的自定义Adapter,继承BaseAdapter,注意data的存储方式
package com.example.adapter; import java.util.List; import java.util.Map; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.example.domxml.R; import com.example.domxml.SmsActivity; /** * 自定义的adapter ListAdapter * @author Administrator * */ public class UserAdapter extends BaseAdapter{ //要显示的数据 private List<Map<String, Object>> data; //接受上下文 private Context context; //声明一个内部类对象 private ViewHolder viewHolder; /** * 通过构造函数传递 * @param data */ public UserAdapter(Context context,List<Map<String, Object>> data) { this.context=context; this.data=data; } //返回的总个数 @Override public int getCount() { return data.size(); } /** * 返回每个条目对应的数据 */ @Override public Object getItem(int position) { // TODO Auto-generated method stub return data.get(position); } /** * 返回的id 就是对应row id 和postion一致 */ @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } /** * 返回这个条目 对应控件对象 */ @Override public View getView(int position, View convertView, ViewGroup parent) { System.out.println("converView@"+convertView); //首先判断当前条目是否为null if (convertView==null) { //初始化这个viewHolder对象 viewHolder = new ViewHolder(); //创建它 convertView = View.inflate(context, R.layout.user_item, null); viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name); viewHolder.tv_phone = (TextView) convertView.findViewById(R.id.tv_phone); viewHolder.btn_call = (Button) convertView.findViewById(R.id.btn_call); viewHolder.btn_sms= (Button) convertView.findViewById(R.id.btn_sms); //google开发者建议使用的 convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } //获取list集合中map对象 Map<String,Object> map = data.get(position); //设置值 viewHolder.tv_name.setText(map.get("names").toString()); final String phone = map.get("phone").toString(); //设置 viewHolder.tv_phone.setText(phone); //具体的按钮注册事件 viewHolder.btn_call.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context, "call---"+phone, 1).show(); //执行打电话 //1.定义打电话的意图对象 Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+phone)); //2.执行意图 context.startActivity(intent); //3.记得添加打电话的权限 在项目清单中添加 } }); //给按钮注册事件 viewHolder.btn_sms.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //执行一个意图 打开发短信界面 //1.定义一个意图 Intent intent = new Intent(context,SmsActivity.class); //通过这个意图可以附带数据 intent.putExtra("phone", phone); //2.执行意图 context.startActivity(intent); } }); return convertView; } //内部类 ViewHolder记录单个条目中所有属性 class ViewHolder{ public TextView tv_name,tv_phone; public Button btn_call,btn_sms; } }
5.MainActivity.java
package com.example.domxml; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import com.example.adapter.UserAdapter; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; public class MainActivity extends Activity { // 声明控件对象 视图V private ListView lv_users; // 集合 private List<Map<String, Object>> data = new ArrayList<Map<String, Object>>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取控件对象 lv_users = (ListView) findViewById(R.id.lv_users); // 视图 jsp html try { // dom解析 users.xml asserts目录中 domParser(); /* * context 上下文 data list集合 resource 资源布局文件 * android.R.layout.simple_list_item_2 text1 text2 * * from map集合中的key是String ids names * * to ids显示在布局文件中对应text2 names显示对应text1 */ // 适配器 控制层 C ListAdapter adapter = new UserAdapter(this, data); // 设置适配器 lv_users.setAdapter(adapter); // 思考 点击具体的一个条目 lv_users.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //获取view控件中的控件 包括用户名控件 电话的控件 TextView tv_name = (TextView) view.findViewById( R.id.tv_name); TextView tv_phone = (TextView) view.findViewById( R.id.tv_phone); //获取用户名称 String name = tv_name.getText().toString(); //获取用户电话 String phone = tv_phone.getText().toString(); //执行打电话 //1.定义打电话的意图对象 Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+phone)); //2.执行意图 startActivity(intent); //3.记得添加打电话的权限 在项目清单中添加 } }); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 解析方法 * * @throws ParserConfigurationException * @throws IOException * @throws SAXException */ private void domParser() throws ParserConfigurationException, IOException, SAXException { // 1.创建DocumentBuilderFactory对象 DocumentBuilderFactory builderFactory = DocumentBuilderFactory .newInstance(); // 2.通过工厂对象获取DocumentBuilder DocumentBuilder builder = builderFactory.newDocumentBuilder(); // // 3 获取要解析的xml文件 对应的输入流 InputStream is = getAssets().open("users.xml"); // 4.利用DocumentBuilder的parse方法获取解析的users.xml的document对象 Document document = builder.parse(is); // 5.处理解析 // 1.获取文档的跟节点 users Element root = document.getDocumentElement(); // 2.获取当前根节点下面所有user节点的集合 NodeList nodeList = root.getElementsByTagName("user"); // 遍历孩子节点 for (int i = 0; i < nodeList.getLength(); i++) { // 获取具体的孩子节点 Node node = nodeList.item(i); // user // 创建map对象 Map<String, Object> map = new HashMap<String, Object>(); // 获取user节点的所有孩子节点 id name NodeList nlist = node.getChildNodes(); // 遍历孩子节点 for (int index = 0; index < nlist.getLength(); index++) { // 获取具体的孩子节点 Node n = nlist.item(index); // 判断该节点的名称是否是id if (n.getNodeName().equals("id")) { // 设置user的id值 map.put("ids", n.getTextContent()); // 判断该节点的名称是否是name } else if (n.getNodeName().equals("name")) { // 设置name值 map.put("names", n.getTextContent()); } else if (n.getNodeName().equals("phone")) { map.put("phone", n.getTextContent()); } } // 添加到集合中 data.add(map); } } }
6.该案例集成了发短信的功能
SmsActivity.java
package com.example.domxml; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.telephony.SmsManager; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class SmsActivity extends Activity { private Button sendBtn; private EditText etphone,etsms; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sms); // 获取点击发送按钮的控件对象 sendBtn = (Button) findViewById(R.id.sendBtn); //获取电话号码的控件对象 etphone=(EditText) findViewById(R.id.etphone); //获取要发送信息的控件对象 etsms = (EditText) findViewById(R.id.etsms); //获取这个数据 String phone = getIntent().getStringExtra("phone"); etphone.setText(phone); Toast.makeText(this, "给这个家伙发短信"+phone, 1).show(); // 注册按钮的点击事件 sendBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //1.获取电话号码及发送的短信内容 String phone = etphone.getText().toString(); String content = etsms.getText().toString(); //2.发短信的管理器对象 SmsManager smsManager = SmsManager.getDefault(); //3.拆分短信内容 List<String> list = smsManager.divideMessage(content); //4.遍历发送信息 for(String sms:list){ //5.逐条发送短信 smsManager.sendTextMessage(phone, null, sms, null, null); } //5.提示短信发送成功 Toast.makeText(SmsActivity.this, "发短信成功", Toast.LENGTH_LONG).show(); } }); } } Activity_sms.xml <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}" > <TextView android:id="@+id/tvphone" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/tip_phone" /> <EditText android:id="@+id/etphone" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/tvphone" android:inputType="phone" /> <TextView android:id="@+id/tvsms" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/etphone" android:text="@string/tip_sms" /> <!-- 作业思考 怎么实现自动换行的效果 --> <EditText android:id="@+id/etsms" android:layout_width="match_parent" android:layout_height="100dp" android:gravity="top" android:layout_below="@+id/tvsms" android:lines="5" /> <Button android:id="@+id/sendBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/etsms" android:text="@string/tip_send" /> </RelativeLayout>
7.运行效果:
点击每一个item将拨打对应条目的号码,点击发短信按钮将给对应号码发短信。
如何解决它们之间的冲突?