【网学网提醒】:网学会员为需要朋友们搜集整理了Android软件开发11-12相关资料,希望对各位网友有所帮助!
Android软件开发11-12
Android软件开发之PreferenceActivity中的组件十一)(十一)
1.PreferenceActivity介绍
PreferenceActivity继承ListActivity它是以一个列表的形式在展现内容,它最主要的特点是添加Preference可以让控件的状态持久化储存,举个例子比如用户选中checkbox后退出应用然后在进入应用,这时用户希望看到的是checkbox被选中,所以软件须要记录用户每次操作的过程并且持久储存,在进入应用的时候须要判断这些久储存的数据然后将系统控件的状态呈现在UI中。尤其是软件开发肯定会有一堆设置选项选项,每次进入Activity都去手动的去取储存的数据,这样代码会变得很复杂很麻烦。这个时候Preference就出来了,它就是专门解决这些特殊的选项保存与读取的显示。用户每次操作事件它会及时的以键值对的形式记录在SharedPreferences中,Activity每次启动
它会自动帮我们完成数据的读取以及UI的显示。android开发中一共为我们提供了4个组件,分别是CheckBoxPreference组件、EditTextPreference组件、ListPreference组件、RingtonePreference组件,下面我用一个例子一一向同学们介绍一下。
2.CheckBoxPreference组件
CheckBoxPreference选中为true取消选中为false它的值会以boolean的形式储存在SharedPreferences中。?>
>>
importandroid.content.Context;importandroid.os.Bundle;importandroid.preference.CheckBoxPreference;importandroid.preference.Preference;importandroid.preference.PreferenceActivity;importandroid.preference.Preference.OnPreferenceChangeListener;importandroid.preference.Preference.OnPreferenceClickListener;importandroid.widget.Toast;publicpublicclassCheckBoxActivityextendsPreferenceActivity{
ContextmContext=nullnull;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);super//从资源文件中添Preferences,选择的值将会自动保存到SharePreferencesaddPreferencesFromResource(R.xml.checkbox);mContext=thisthis;//CheckBoxPreference组件CheckBoxPreferencemCheckbox0=(CheckBoxPreference)findPreference("checkbox_0");
mCheckbox0.setOnPreferenceClickListener(newOnPreferenceClickListener(){new@OverridepublicbooleanonPreferenceClick(Preferencepreference){//这里可以监听到这个CheckBox的点击事件true;return
true}});mCheckbox0.setOnPreferenceChangeListener(newOnPreferenceChangeListener(){new@OverridepublicbooleanonPreferenceChange(Preferencearg0,ObjectnewValue){//这里可以监听到checkBox中值是否改变了//并且可以拿到新改变的值Toast.makeText(mContext,"checkBox_0改变的值为"+(Boolean)newValue,Toast.LENGTH_LONG).show();
true;returntrue}});CheckBoxPreferencemCheckbox1=(CheckBoxPreference)findPreference("checkbox_1");
mCheckbox1.setOnPreferenceClickListener(newOnPreferenceClickListener(){new@OverridepublicbooleanonPreferenceClick(Preferencepreference){//这里可以监听到这个CheckBox的点击事件true;returntrue}});mCheckbox1.setOnPreferenceChangeListener(newOnPreferenceChangeListener(){new@OverridepublicbooleanonPreferenceChange(Preferencearg0,ObjectnewValue){//这里可以监听到checkBox中值是否改变了//并且可以拿到新改变的值Toast.makeText(mContext,"checkBox_1改变的值为"+(Boolean)newValue,Toast.LENGTH_LONG).show();true;returntrue}});}}
3.EditTextPreference组件
EditTextPreference点击后会弹出一个输入框,输入的内容会以字符串的的形式储存在SharedPreferences中。?>>>>>
importandroid.content.Context;importandroid.os.Bundle;importandroid.preference.EditTextPreference;importandroid.preference.PreferenceActivity;publicclassEditTextActivityextendsPreferenceActivity{ContextmContext=nullnull;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);super
//从资源文件中添Preferences,选择的值将会自动保存到SharePreferencesaddPreferencesFromResource(R.xml.edittext);mContext=thisthis;//EditTextPreference组件EditTextPreferencemEditText=(EditTextPreference)findPreference("edit_0");//设置dialog按钮信息mEditText.setPositiveButtonText("确定");mEditText.setNegativeButtonText("取消");//设置按钮图标mEditText.setDialogIcon(R.drawable.jay);}}
4.ListPreference组件
在res/array中先写两个数组,一个用与list的显示内容,一个用户list的选中数值。?>>- 10mins.
- 20mins.
em>- 30mins.
- 60mins.
>- 600000
- 1200000
- 1800000
- 3600000
ListPreference点击后会弹出一个列表框,选中后会将选中的内容(上面数组中的值)会以字符串的的形式储存在SharedPreferences中。?>>> android:dialogTitle="选择在线时间"android:entries="@array/auto_logout_time_key"android:entryValues="@array/auto_logout_time_value">
importandroid.os.Bundle;importandroid.preference.PreferenceActivity;publicclassListActivityextendsPreferenceActivity{
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);super//从资源文件中添Preferences,选择的值将会自动保存到SharePreferencesaddPreferencesFromResource(R.xml.list);}}
5.RingtonePreference组件
RingtonePreference点击后会弹出一个系统铃声的列表框,选中后会将选中的内容(uri字符集)会以字符串的的形式储存在SharedPreferences中。?>>> android:title="铃声设置"android:ringtoneType="all"android:showSilent="true">android:ringtoneType系统一共提供了4中响铃模式的类型分别为铃声(ringtone)通知(notification)警告(alarm)全部(all)模拟器默认是没有铃声的,下图中的铃声我是将歌曲文件拷贝到SD卡中,设置铃声后才会出现的。如果觉得拷贝麻烦可以使用豌豆荚或者91助手将歌曲文件放入手机SD卡中,在铃声设置那里设置一下在这里就会出现。
importandroid.os.Bundle;importandroid.preference.PreferenceActivity;publicclassRingtoneActivityextendsPreferenceActivity{@OverrideprotectedvoidonCreate(BundlesavedIn
stanceState){super.onCreate(savedInstanceState);super//从资源文件中添Preferences,选择的值将会自动保存到SharePreferencesaddPreferencesFromResource(R.xml.ringtone);}}
5.自定义控件5.自定义控件
使用系统的控件在显示方面难免会有些单一,如果想做一个好看的界面就需要使用自定义Preference。下面我简单说明一下如何编写自定义Preference。首先在res/layout中添加preferences文件?> android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#00000000">> android:layout_width="fill_parent"android:layout_height="wrap_content">> android:fadingEdge="horizontal"android:layout_width="wrap_content"android:layout_height="wrap_content"android:singleLine="true">/>
android:background="@drawable/preference_mid_background"通过这一行可以设置这个按钮的点击、选中默认的显示状态,这样可以让你的按钮更加好看。须要在res/drawable中添加xml文件android:state_facused:为控件选中显示android:state_pressed:为控件按下显示最后一个为默认显示?>> >
importandroid.content.Context;importandroid.os.Bundle;importandroid.preference.Preference;importandroid.preference.PreferenceActivity;importandroid.preferen
ce.Preference.OnPreferenceClickListener;importandroid.widget.Toast;
publicclassAllActivityextendsPreferenceActivity{/**自定义布局A**/Preferencepreference0=nullnull;/**自定义布局B**/Preferencepreference1=nullnull;ContextmContext=nullnull;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);super//从资源文件中添Preferences,选择的值将会自动保存到SharePreferencesaddPreferencesFromResource(R.xml.all);mContext=thisthis;preference0=findPreference("pref_key_0");preference0.setOnPreferenceClickListener(newOnPreferenceClickListener(){new@OverridepublicbooleanonPreferenceClick(Preferencepreference){Toast.makeText(mContext,"自定义布局A被按下",Toast.LENGTH_LONG).show();false;returnfalse}});preference1=findPreference("pref_key_1");preference1.setOnPreferenceClickListener(newOnPreferenceClickListener(){new@Override
publicbooleanonPreferenceClick(Preferencepreference){Toast.makeText(mContext,"自定义布局B被按下",Toast.LENGTH_LONG).show();false;returnfalse}});}读取数据在PreferenceActivity中可以用下面这种方式拿到SharedPreferences中储存的数值,通过PreferenceManager.getDefaultSharedPreferences(this)方法拿到控件默认储存的sharedPreferences对象。SharedPreferencesprefs=PreferenceManager.getDefaultSharedPreferences(this);booleansomething=prefs.getBoolean("something",false);在模拟起中将SharedPreferences储存内容拷贝出来后,可以清楚的看到通过点击系统控件储存的数值。这里我说一下铃声的储存,它是以一个字符串形式的uri字符集,它所指向的是系统铃声储存的路径。所以根据这个字符集就可以找到这个铃声。
Android软件开发之获取通讯录联系人信息(十二)软件开发之获取通讯录联系人信息十二)人信息(
图中选中的数据库contacts2.db就是系统储存联系人的数据库,我们将它打开看看里面储存了些什么东东?
打开contacts.db后发面里面有一堆表,同学们先别慌张。今天我们主要讨论红框内的4个比较常用的表,后期我在介绍其它表的使用。这里说一下如果你想在真机上查看数据库的话必需要先获得roo
t权限,否则无法查看。
1.contacts表
_id:表的ID,主要用于其它表通过contacts表中的ID可以查到相应的数据。display_name:联系人名称photo_id:头像的ID,如果没有设置联系人头像,这个字段就为空times_contacted:通话记录的次数last_time_contacted:最后的通话时间lookup:是一个持久化的储存因为用户可能会改名子但是它改不了lookup
2.data表
raw_contact_id:通过raw_contact_id可以找到raw_contact表中相对的数据。data1到data15这里保存着联系人的信息联系人名称联系人电话号码电子邮件备注等等。
3.phone_look_up表
data_id:通过data_id可以找到datat表中相对的数据。raw_contact_id:通过raw_contact_id可以找到raw_contact_表中相对的数据。normalized_number:这个字段就比较有意思了,它是将每个电话号码逆序排列。
4.raw_contact表
version:版本号,用于监听变化deleted:删除标志,0为默认1表示这行数据已经删除display_name:联系人名称last_time_contacts:最后联系的时间
有关这些的源码都在android.provider.ContactsContract这个类里面,如果想深入了解的话可以去看看,数据库相关的操作联查啊啥的都在里面。
下面说说代码是怎么用的
先说说Phone.CONTENT_URI,获取联系人的时候需要去这个url中去找数据。它所指向的其实是“content://com.android.contacts/data/phones”。这个url对应着contacts表和raw_contacts表以及data表所以说我们的数据都是从这三个表中获取的。这里强调一下query第二个参数privatestaticfinalString[]PHONES_PROJECTION=newString[]{Phone.DISPLAY_NAME,Phone.NUMBER,Photo.PHOTO_ID,Phone.CONTACT_ID};它的意思是只去表中找显示名称电话号码头像ID联系人ID这4个数据,如果你须要其它数据的话就须要修改这里。获得手机通讯录联系人信息/**得到手机通讯录联系人信息**/privatevoidgetPhoneContacts(){ContentResolverresolver=mContext.getContentResolver();//获取手机联系人CursorphoneCursor=resolver.query(Phone.CONTENT_URI,PHONES_PROJECTION,null,null,null);if(phoneCursor!=null){while(phoneCursor.moveToNext()){//得到手机号码StringphoneNumber=phoneCursor.getString(PHONES_NUMBER_INDEX);//当手机号码为空的或者为空字段跳过当前循环if(TextUtils.isEmpty(phoneNumber))
continue;//得到联系人名称StringcontactName=phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);//得到联系人IDLongcontactid=phoneCursor.getLong(PHONES_CONTACT_ID_INDEX);//得到联系人头像IDLongphotoid=phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);//得到联系人头像BitampBitmapcontactPhoto=null;//photoid大于0表示联系人有头像如果没有给此人设置头像则给他一个默认的if(photoid>0){Uriuri=Co
ntentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,contactid);InputStreaminput=ContactsContract.Contacts.openContactPhotoInputStream(resolver,uri);contactPhoto=BitmapFactory.decodeStream(input);}else{contactPhoto=BitmapFactory.decodeResource(getResources(),R.drawable.contact_photo);}mContactsName.add(contactName);mContactsNumber.add(phoneNumber);mContactsPhonto.add(contactPhoto);}phoneCursor.close();}
}获得手机sim卡联系人信息sim卡和手机本人获取的方式类似只是url有点不一样,须要注意的一点是sim卡是没有联系人头像的。/**得到手机SIM卡联系人人信息**/privatevoidgetSIMContacts(){ContentResolverresolver=mContext.getContentResolver();//获取Sims卡联系人Uriuri=Uri.parse("content://icc/adn");CursorphoneCursor=resolver.query(uri,PHONES_PROJECTION,nullnullnull,null,null);nullnull)if(phoneCursor!=null{while(phoneCursor.moveToNext()){
//得到手机号码StringphoneNumber=phoneCursor.getString(PHONES_NUMBER_INDEX);//当手机号码为空的或者为空字段跳过当前循环if(TextUtils.isEmpty(phoneNumber))continue;continue//得到联系人名称StringcontactName=phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);//Sim卡中没有联系人头像mContactsName.add(contactName);
mContactsNumber.add(phoneNumber);}phoneCursor.close();}}这个界面就可以看到联系人的名称号码以及头像了。如果想在模拟器上看须要将图片拷贝到SD卡中,然后在联系人中设置一下,这里就可以看到头像了,或者真机上会比较清楚、
任意点击一个联系人会调用系统拨打电话的界面,代码如下。//调用系统方法拨打电话
IntentdialIntent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:"+mContactsNumber.get(position)));startActivity(dialIntent);
最重要的是须要AndroidManifest.xml中加入权限否则代码会报错的。千万别忘了。/>/>下面给出完整的代码
importjava.io.InputStream;importjava.util.ArrayList;importandroid.app.ListActivity;importandroid.content.ContentResolver;importandroid.content.ContentUris;importandroid.content.Context;importandroid.content.Intent;importimportandroid.database.Cursor;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.net.Uri;importandroid.os.Bundle;importandroid.provider.ContactsContract;importandroid.provider.ContactsContract.CommonDataKinds.Phone;importandroid.provider.ContactsContract.CommonDataKinds.Photo;importandroid.text.TextUtils;importandroid.view.LayoutInflater;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.AdapterView;importandroid.widget.BaseAdap
ter;importandroid.widget.ImageView;importandroid.widget.ListView;
importandroid.widget.TextView;importandroid.widget.AdapterView.OnItemClickListener;publicclassContactsActivityextendsListActivity{ContextmContext=nullnull;/**获取库Phon表字段**/privatestaticfinalString[]PHONES_PROJECTION=newString[]{Phone.DISPLAY_NAME,Phone.NUMBER,Photo.PHOTO_ID,Phone.CONTACT_ID};/**联系人显示名称**/privatestaticfinalintPHONES_DISPLAY_NAME_INDEX=0;/**电话号码**/privatestaticfinalintPHONES_NUMBER_INDEX=1;/**头像ID**/privatestaticfinalintPHONES_PHOTO_ID_INDEX=2;/**联系人的ID**/privatestaticfinalintPHONES_CONTACT_ID_INDEX=3;/**联系人名称**/privateArrayListmContactsName=newArrayList();/**联系人头像**/privateArrayListmContactsNumber=newArrayList();/**联系人头像**/privateArrayListmContactsPhonto=newArrayList();ListViewmListView=nullnull;MyListAdaptermyAdapter=nullnull;
@OverridepublicvoidonCreate(BundlesavedInstanceState){mContext=thisthis;mListView=thisthis.getListView();/**得到手机通讯录联系人信息**/getPhoneContacts();myAdapter=newMyListAdapter(thisthis);thissetListAdapter(myAdapter);mListView.setOnItemClickListener(newOnItemClickListener(){new@OverridepublicvoidonItemClick(AdapterView>adapterView,Viewview,intposition,longid){//调用系统方法拨打电话IntentdialIntent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:"+mContactsNumber.get(position)));startActivity(dialIntent);}});super.onCreate(savedInstanceState);super}/**得到手机通讯录联系人信息**/privatevoidgetPhoneContacts(){ContentResolverresolver=mContext.getContentResolver();
//获取手机联系人CursorphoneCursor=resolver.query(Phone.CONTENT_URI,PHONES_PROJECTION,nullnullnullnull,null,null);null)if(phoneCursor!=null{while(phoneCursor.moveToNext()){//得到手机号码StringphoneNumber=phoneCursor.getString(PHONES_NUMBER_INDEX);//当手机号码为空的或者为空字段跳过当前循环if(TextUtils.isEmpty(phoneNumber))continue;continue//得到联系人名称StringcontactName=phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);//得到联系人IDLongcontactid=phoneCursor.getLong(PHONES_CONTACT_ID_INDEX);//得到联系人头像IDLongphotoid=phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);//得到联系人头像BitampBitmapcontactPhoto=nullnull;//photoid大于0表示联系人有头像如果没有给此人设置头像则给他一个默认的if(photoid>0){ifUriuri=ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,contactid);InputStreaminput=ContactsContract.Contacts.openContactPhotoInputStream(resolver,uri);contactPhoto=BitmapFactory.decodeStream(input);}else{else
contactPhoto=BitmapFactory.decodeResource(getResources(),R.drawable.contact_photo);
}mContactsName.add(contactName);mContactsNumber.add(phoneNumber);mContactsPhonto.add(contactPhoto);}phoneCursor.close();}}/**得到手机SIM卡联系人人信息**/privatevoidgetSIMContacts(){ContentResolverresolver=mContext.getContentResolver();//获取Sims卡联系人Uriuri=Uri.parse("content://icc/adn");CursorphoneCursor=resolver.query(uri,PHONES_PROJECTION,nullnullnull,null,null);nullnull)if(phoneCursor!=null{while(phoneCursor.moveToNext()){//得到手机号码StringphoneNumber=phoneCursor.getString(PHONES_NUMBER_INDEX);//当手机号码为空的或者为空字段跳过当前循环if(TextUtils.isEmpty(phoneNumber))continue;continue
//得到联系人名称StringcontactName=phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);//Sim卡中没有联系人头像mContactsName.add(contactName);mContactsNumber.add(phoneNumber);}phoneCursor.close();}}classMyListAdapterextendsBaseAdapter{publicMyListAdapter(Contextcontext){mContext=context;}publicintgetCount(){//设置绘制数量returnmContactsName.size();}@OverridepublicbooleanareAllItemsEnabled(){false;returnfalse}publicObjectgetItem(intposition){int
returnposition;}publiclonggetItemId(intposition){intreturnposition;}publicViewgetView(intposition,ViewconvertView,ViewGroupparent){intImageViewiamge=nullnull;TextViewtitle=nullnull;TextViewtext=nullnull;null)if(convertView==null{convertView=LayoutInflater.from(mContext).inflate(R.layout.colorlist,nullnull);iamge=(ImageView)convertView.findViewById(R.id.color_image);title=(TextView)convertView.findViewById(R.id.color_title);text=(TextView)convertView.findViewById(R.id.color_text);}//绘制联系人名称title.setText(mContactsName.get(position));//绘制联系人号码text.setText(mContactsNumber.get(position));//绘制联系人头像iamge.setImageBitmap(mContactsPhonto.get(position));returnconvertView;
}}}列表的布局文件?>> android:ellipsize="marquee"android:textSize="20dip
"/>