PreferenceActivity

一 相应组件

关系图:


PreferenceGroup
(1)方法

public void setOrderingAsAdded(boolean orderingAsAdded)

当一个preference被add进来的时候是否排序,如果是true 的话,那么对于那些没有order的将根据里面的preference的order 跟 默认字母进行排序  。在Add一个preference的时候,是不会重新排序的,需要在add之前调用这个方法,应该要在早一点调用这个方法,这个描述好抽象。

public boolean isOrderingAsAdded()  

 当add一个preference的时候是否可以排序

public void addItemFromInflater(Preference preference)  

 被Inflater 调用增加进来

public int getPreferenceCount()   

返回这个group中的preference的个数

public Preference getPreference(int index)  

 返回group的第index元素。

public boolean addPreference(Preference preference)   

add 一个 preference进来,但是位置跟order是有关系的,返回是否增加成功

public boolean removePreference(Preference preference)  

从group中移除  返回是否移除成功

public void removeAll( ) 

移除所有的

public Preference findPreference(CharSequence key)   

根据Key来找到一个preference,没有找到就返回null,如果有个相同key的preference,那么会返回前一个preference 

public void setEnabled(boolean enabled)   

group的enable ,如果false 那么这个group里面都无法响应click事件

PreferenceCategory

PreferenceCategory  

它是一个PreferenceGroup的子类,而且是被禁用的,那么它就不可以被点击了,可以用于分类

在父类的基础上只有一个方法

public boolean isEnabled()  检测是否被enable了

3  PreferenceScreen
PreferenceScreen 代表着preference的层次机构中的最顶层,为了显示这个类,需要一个 PreferenceActivity 指向一个实例化的PreferenceScreen。从中得之,是需要PreferenceActivity来显示的,而且是最顶层的。这个类能出现在2个地方:
   
   
1. PreferenceActivity指向它的时候,也就是PreferenceActivity调用addPreferencesFromResource的时候才被当做一个根(可以理解为布局的最外层),但是是没有显示的
2.出现在Preference层次机构内部的时候, 那么它显示出来,并且是当被点击的时候会显示一个对话框形式的Preference 或者直接启动一个Intent。并且它里面的内容不会被显示     很点难理解,后面有试验代码的。官方有一个布局实例
(1)方法
public ListAdapter getRootAdapter()  
返回一个能被加到PreferenceActivity上显示的adapter,这个Adapter的getItem会返回Preference的子类 , 这个PreferenceScreen不会出现在在adapter中,而是出现在这个PreferenceScreen的上面
public void bind(ListView listView)  
把一个ListView跟加进来,是使得ListView 跟getRootAdapter() 绑定,并且可以点击ListView的item
public void onDismiss(DialogInterface dialog) 
前面有说过“出现在Preference层次机构内部的时候, 那么它显示出来,并且是当被点击的时候会显示一个对话框形式的Preference”  ,那么这个回调就是当那个dialog 消失的时候调用的。
public Dialog getDialog() 
 得到对话框  
public void onItemClick(AdapterView parent,View view,int position,long id)  
当Item被点击的时候的回调
4 RingtonePreference 系统铃
android:ringtoneType 设置响铃模式,主要包括ringtone、notification、alarm、all   android:showSilent 是否显示静音   
注意,如果模拟器中没有铃声的话,我们可以自己添加。将音乐复制到SD卡上,然后转到android media player应用程序,选择该音乐,  单击menu,然后选择  uses as ringtone  
<RingtonePreference
android:ringtoneType="all"
android:title="设置铃铛"
android:summary="选择铃铛"
android:key="ring_key"
android:showDefault="true"
android:showSilent="true" />
EditTextPreference
(1)属性
  android:dialogTitle 对话框标题
  android:key 标识key
  android:summary简要说明
  android:title标题
<EditTextPreference
android:key="edt_key"
android:title="填写用户名"
android:summary="用户名不能为空"
android:dialogTitle="输入您的用户名"
android:defaultValue="默认值"
android:dialogMessage="使用汉语"/>
6 ListPreference
有两个属性要注意:
android:entries: 设置的内容是我们在设置时看到的内容
android:entryValues:保存在preferences.xml中的值
其余属性同上。
使用如下:
<string-array name="array_sex">
<item></item>
<item></item>
</string-array>
<string-array name="array_sex_value">
<item>1</item>
<item>2</item>
</string-array>
<ListPreference
android:key="list_key"
android:title="性别"
android:entryValues="@array/array_sex_value"
android:entries="@array/array_sex"
android:dialogTitle="性别列表"
android:summary="请选择您的性别"/>
7 Checkboxference
有两个属性要注意:
android:summaryOn:开启说明
android:summaryOff:关闭说明
<CheckBoxPreference
android:key="check_key"
android:title="自动保存进度条"
android:summaryOn="自动保存:开启"
android:summaryOff="自动保存:关闭"/>

二 findPreference

      查找组件时,对view来说是调用findViewById函数,通过view的id就可以找到我们想要的组件,但对于preference元素来说,则需要调用函数findPreference通过设置的key来查看组件,如:
ringtonePreference = (RingtonePreference) findPreference("ring_key");
editTextPreference = (EditTextPreference) findPreference("edt_key");
listPreference = (ListPreference) findPreference("list_key");
checkBoxPreference = (CheckBoxPreference) findPreference("check_key");

三 设置监听

    对于 preference元素来说有两个重要的监视器一个点击监听,另一个是值改变监听,它们源码如下:
public interface OnPreferenceChangeListener {
/**
* Called when a Preference has been changed by the user. This is
* called before the state of the Preference is about to be updated and
* before the state is persisted.
*
* @param preference The changed Preference. 值改变的组件
* @param newValue The new value of the Preference. 改变后的新值 将根据不同的组件返回不同值及其类型
* @return True to update the state of the Preference with the new value.
*/
boolean onPreferenceChange(Preference preference, Object newValue);
}

/**
* Interface definition for a callback to be invoked when a {@link Preference} is
* clicked.
*/
public interface OnPreferenceClickListener {
/**
* Called when a Preference has been clicked.
*
* @param preference The Preference that was clicked. 被点击的组件
* @return True if the click was handled.
*/
boolean onPreferenceClick(Preference preference);
}
使用示例:
ringtonePreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
//返回铃声所在库的地址 String类型 如:content://media/internal/audio/media/32
String uri = newValue.toString();
Toast.makeText(getActivity(), ("路径:" + uri), Toast.LENGTH_SHORT).show();
return false;
}
});
ringtonePreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "preference.getTitle():" + preference.getTitle(), Toast.LENGTH_SHORT).show();
return false;
}
});
editTextPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
//返回确认后的新值 String类型
Toast.makeText(getActivity(), ((String) newValue), Toast.LENGTH_SHORT).show();
return false;
}
});

listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
//返回确认后的新值 String类型
Toast.makeText(getActivity(), ((String) newValue), Toast.LENGTH_SHORT).show();
return false;
}
});

checkBoxPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
//返回 true false boolean类型
boolean isSelected = (boolean) newValue;
if (isSelected){
Toast.makeText(getActivity(), "开启", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getActivity(), "关闭", Toast.LENGTH_SHORT).show();
}
return false;
}
});
效果图:

四 遇见的异常:

1 Subclasses of PreferenceActivity must override isValidFragment(String)
异常描述:
Caused by: java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid! com.eric.windows.event.MyPreferenceActivity has not checked if fragment com.eric.windows.event.MyPreferenceFragment is valid.
原因:SDK19以上的安全限制,需要重写isValidFragment。
解决方案: 重写isValidFragment,如:

@Override
protected boolean isValidFragment(String fragmentName) {
return true;
}

完整示例源码点击查看。
参考:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值