|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 青玄 于 2014-11-5 23:03 编辑
源码概述:*******************************************布局文件与配置文件**************************************************************
1.布局文件:(1)activity_contacts.xml:用来显示取消和确定的;(2)activity_main.xml:用来显示短信界面的
(3)ui_phone_view.xml:用来显示联系人信息的;(4)contacts_items.xml:这个事显示自定义组件的
2.AndroidMainfest.xml文件的配置:
(1)权限的配置:
- <uses-permission android:name="android.permission.SEND_SMS"/>
- <uses-permission android:name="android.permission.READ_SMS"/>
- <uses-permission android:name="android.permission.WRITE_SMS"/>
- <uses-permission android:name="android.permission.READ_CONTACTS"/>
- <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
复制代码 (2)activity的配置:
- <activity android:name="com.cbd.sendsms.SelectContactsActivity" android:label="选择联系人"></activity>
复制代码 3.创建自定义组件时values文件夹所需要的配置文件declare.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <declare-styleable name="phone_view">
- <attr name="name" format="string" />
- <attr name="phone" format="string" />
- </declare-styleable>
- </resources>
复制代码 ***********************************************src里面的代码概述以及知识概述**************************************************
1.自定义控件:
自定义控件实质上就是继承view类或者view类的子类所实现的一些功能而已!用它我们可以编写自己所需要的控件,就拿本案例
来说:这个类继承了RelativeLayout然后在构造方法里面实现自定义控件的操作:
首先我们需要获取局部填充器然后调用inflate方法将布局文件转化为一个view对象,然后将view里面的值赋给本类中的tv_name,
tv_phone,然后取得配置文件中的属性值,将它设置到本类中的成员里面去。其实自定义控件说白了,就是在子类里面定义一些控件的类,
然后将其她的布局文件转化成view类,再将这个view所包含的属性赋给本类中的成员而已!一下是自定义控件的主要代码:
- package com.cbd.sendsms.ui;
- import com.cbd.sendsms.R;
- import android.content.Context;
- import android.content.res.TypedArray;
- import android.util.AttributeSet;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.widget.CheckBox;
- import android.widget.RelativeLayout;
- import android.widget.TextView;
- public class PhoneView extends RelativeLayout {
- private TextView tv_name;
- private TextView tv_phone;
- private CheckBox checkBox;
- public PhoneView(Context context, AttributeSet attrs) {
- super(context, attrs);
- // 获取局部填充器把ui_phone_view.xml文件中的各种控件对象找到并赋给本类中的tv_name,tv_phone,cb
- LayoutInflater layoutInflater = (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- View view = layoutInflater.inflate(R.layout.ui_phone_view, this);
- tv_name = (TextView) view.findViewById(R.id.tv_ui_phone_name);
- tv_phone = (TextView) view.findViewById(R.id.tv_ui_phone_content);
- checkBox = (CheckBox) view.findViewById(R.id.cb_ui_phoneview_status);
- // 取得清单文件中的属性值
- TypedArray typeArray = context.obtainStyledAttributes(attrs,
- R.styleable.phone_view);
- // 取得清单文件中的属性值
- String name = typeArray.getString(R.styleable.phone_view_name);
- String phone = typeArray.getString(R.styleable.phone_view_phone);
- tv_name.setText(name);
- tv_phone.setText(phone);
-
- }
-
- public void setName(String name)
- {
- tv_name.setText(name);
- }
-
- public void setPhone(String phone)
- {
- tv_phone.setText(phone);
- }
-
- public boolean isChecked()
- {
- return checkBox.isChecked();
- }
-
- public void setCheckBox(boolean isChecked)
- {
- checkBox.setChecked(isChecked);
- }
-
- }
复制代码 2.发送短信的方法:
- public void send(View v)
- {
- if(selectedFlag==0 //这个标志的意思是说,如果是用户自己输入的话,那就执行这个if
- {
- String mobileNumber=mobile.getText().toString().trim();
- String contents=content.getText().toString().trim();
- if(!TextUtils.isEmpty(mobileNumber) && !TextUtils.isEmpty(contents))
- {
- ContentValues values=new ContentValues();
- values.put("address",mobileNumber);
- values.put("type",2);
- SmsManager smsManager=SmsManager.getDefault();
- List<String> listSms=smsManager.divideMessage(contents);
- for(String s : listSms)
- {
- smsManager.sendTextMessage(mobileNumber, null, s, null, null);
- values.put("body",s);
- values.put("date", new Date().getTime());
- resolver.insert(uri, values);
- }
- values=null;
- mobile.setText("");
- content.setText("");
- Toast.makeText(this, "信息发送成功!", Toast.LENGTH_SHORT).show();
- }else{
- Toast.makeText(this, "电话号码或信息内容不能为空!", Toast.LENGTH_SHORT).show();
- }
- }else //如果不是用户自己输入的话就执行这段代码
- String contents=content.getText().toString().trim();
- if(!TextUtils.isEmpty(contents)) //判断联系人为不为空
- {
- //循环选中的每个联系人发送信息
- for(Contact c : selectContact) //循环集合里面的内容
- {
- ContentValues values=new ContentValues();
- values.put("address",c.getPhone()); //号码
- values.put("type",2); //发送发的类型码
- SmsManager smsManager=SmsManager.getDefault(); //
- List<String> listSms=smsManager.divideMessage(contents); //拆分字数,分批发送每次最多发送70个字
- for(String s : listSms)
- {
- smsManager.sendTextMessage(c.getPhone(), null, s, null, null); //执行发送方法
- values.put("body",s);
- values.put("date", new Date().getTime());
- resolver.insert(uri, values); //将发送的数据插入到数据库中
- }
- values=null;
- Toast.makeText(this, "给"+c.getName()+"发送信息成功!", Toast.LENGTH_SHORT).show();
- }
-
- mobile.setText("");
- content.setText("");
- selectContact=null;
- selectedFlag=0;
- mobile.setEnabled(true); //文本框变为可用
-
-
- }else{
- Toast.makeText(this, "信息内容不能为空!", Toast.LENGTH_SHORT).show();
- }
- }
-
-
-
- }
复制代码
3.给组件设置适配器的类:
- private class MyAdapter extends BaseAdapter
- {
- @Override
- public int getCount() {
-
- return contacts.size(); //这个返回的是联系人的总数
- }
- @Override
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return contacts.get(position); //返回所指定的条目
- }
- @Override
- public long getItemId(int position) {
- // TODO Auto-generated method stub
- return position; //返回指定条目的位置
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View view=View.inflate(SelectContactsActivity.this, R.layout.contacts_items, null);
- //将布局文件转化为view对象注意这个布局文件里面的组件就是你自定义的那个组件
- PhoneView phoneView=(PhoneView) view.findViewById(R.id.phoneView); //获取自定义组件的对象
- phoneView.setName(contacts.get(position).getName()); //设置它的属性
- phoneView.setPhone(contacts.get(position).getPhone());
- phoneView.setCheckBox(contacts.get(position).isChecked());
- return view; //返回view对象
- }
-
- }
复制代码
|
|