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>