Preference相关学习

来源:互联网 发布:360n5手机怎么样 知乎 编辑:程序博客网 时间:2024/05/22 00:28

(1)Preference类学习

javacode:

importandroid.content.SharedPreferences;

//获取SharedPreferences对象,获取这个对象有三种方法。

//第一种方法是PreferenceManager类的抽象方法,获取到的是通过Android的偏好管理器来获取其所管理的preferences。只有第一种方式可以获取到res/xml下配置的preferenceXML信息。

SharedPreferencesprefs=PreferenceManager.getDefaultSharedPreference(Context);

SharedPreferencesprefs=getSharedPreferences("data",MODE_PRIVATE)

SharedPreferencesprefs=getPreferences(MODE_PRIVATE)

//

res/xmlpreferenceXML文件

新建xxx.xml

使用标签<PreferenceScreen></PreferenceScreen>

<PreferenceCategory></PreferenceCategory>

组件标签有

<Preference/>//相当于TextView

<CheckBoxPreference/>

<SwitchPreference/>

<EditTextPreference/>//弹框方式

<ListPreference/>//弹框方式

<RingtonePreference/>

组件标签常用的属性有

android:key=”xxx”//key如果不设置的话也可以,但是没设置key的组件不会保留之前的选中的状态。实测是这样的

android:title=”xxx”

android:summery=”xxx”

android:defaultValue=”xxx“//例如,CheckPreference的默认值可为”true”,默认为选中状态;

EditTextPreference的默认值可为”110”

android:enabled: 表示该Preference是否可用状态。

android:persistent: 表示Preference元素所对应的值是否写入sharedPreference文件中,如果是true,则表示写入;否则,则表示不写入该Preference元素的值。

android:dependency: 表示一个Preference(A表示)的可用状态依赖另外一个Preference(B表示)B可用,则A可用;B不可用,则A不可用。比如两个页面的两个相互关联状态。

android:disableDependentsState: 与android:dependency相反。B可用,则A不可用;B不可用,则A可用。

获取SharedPreferences对象中保存的key-value

prefs.getString(“keyname”,defValue);//前面是key字符串,后面是默认没找到给的默认值

如何把自定义的xml文件添加到Activity

首先要使用PreferenceActivity或者PreferenceFragment

调用api

addPreferencesFromResource(R.xml.xxx);

SharedPreference生成的文件路径

data/date/packagename(包名)/packagename_preferences.xml这个是使用res/xml那种方式生成的文件


SharedPreferencesprefs=getSharedPreferences("data",MODE_PRIVATE)

data/date/packagename(包名)/data.xml

SharedPreferencesprefs=getPreferences(MODE_PRIVATE)

data/date/packagename(包名)/当前Activity的类名.xml

代码中实例

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

addPreferencesFromResource(R.xml.preferencet1);

SharedPreferencesprefs =PreferenceManager.getDefaultSharedPreferences(this) ;

//获取Preference对象的方法,也就是xml文件中的各个组件

PreferencemPreference=getPreferenceManager().findPreference("checkbox");

//常用apigetKey() setKey() getSummary() setSummary()

mPreference.setKey("sbcheckbox");

//Preference设置点击事件实现Activity跳转(代码中实现和xml文件中实现,回头再研究)

Log.e("key",mPreference.getKey());

Log.e("list",""+prefs.getString("list", "what??"));

//ListPreference设置默认选中项

publicvoidsetValueIndex(intindex) {

if(mEntryValues!=null){

setValue(mEntryValues[index].toString());

}

}

(2)如何在PreferenceActivityor PreferenceFragment的布局中添加图片

因为不是用的setContentLayout(R.layout.xxx)

而是addPreferencesFromResource(R.xml.xxx)诸如此类的api

res/xml下的xml文件并不接受ImageView这样的控件。一般都是Preference标签。

那么我们只有自定义类

publicclass PicturePreference extends Preference {

privateContext mContext;


publicPicturePreference(Context context, AttributeSet attrs, int defStyle){

super(context,attrs, defStyle);

this.mContext= context;

//TODO Auto-generated constructor stub

}


publicPicturePreference(Context context, AttributeSet attrs) {

this(context,attrs, 0);

//TODO Auto-generated constructor stub

}


publicPicturePreference(Context context) {

this(context,null, 0);

//TODO Auto-generated constructor stub

}


@Override

publicView onCreateView(ViewGroup parent) {



LayoutInflaterinflater = (LayoutInflater) mContext

.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

ViewmyView = inflater.inflate(R.layout.picture_item,

null);

returnmyView;

}

}

然后在res/xml的文件中添加标签,和自定义组件添加到布局文件中有点像,要加上完整的包名。

<com.example.test.PicturePreference

android:key=”picture”>

</com.example.test.PicturePreference>

有时候图片涉及到横屏,竖屏。那么要分别在res/layout,res/layout-land中加上同名的文件(picture_item.xml,中间引用的图片资源修改下就行了,分别对应横屏,竖屏的)。横屏的图片,竖屏的图片放在同一个res/drawale-xxx目录下就行了。

(3)EditText,TextViewEditTextPreference中设置限制字符个数

xml文件中android:maxLength=”3”

或者代码中:

mEditText.setFilters(newInputFilter[]{

newInputFilter.LengthFilter(4)

});

有时候碰到EditTextPreference对象,要求限制它的输入个数。

因为这个类封装了一个EditText在里面,所以想法获取这个EditText.

刚好EditTextPreference类提供了

publicEditText getEditText() {

returnmEditText;

}

那么我们在哪去设置这个mEditText的属性呢?肯定不能在这个EditText显示后再设置。

我们可以自定义类MyEditTextPreferenceextends EditTextPreference

已知publicclassEditTextPreferenceextendsDialogPreference {}

我们重写它的onCreateDialogView()方法。

protectedView onCreateDialogView() {

//set the dialog layout

setDialogLayoutResource(R.layout.pref_dialog_editpin);


Viewdialog = super.onCreateDialogView();


getEditText().setFilters(newInputFilter[]{

newInputFilter.LengthFilter(4)

});

returndialog;

}

这样就ok了。

(4)对于package/apps/Settings里面的SettingsPreferenceFragment

有一个方法setHasOptionsMenu(booleanshow);

实际这个方法是Fragment中封装好了的。

用来控制是否显示overflow的那个3个点的btn

(5)对于package/apps/Settings想要移除Preference某一项的时候

removePreference(KEY_AUTO_ROTATE);形参是key

实现在SettingsPreferenceFragment.java

protectedvoid removePreference(String key) {

Preferencepref = findPreference(key);

if(pref != null) {

getPreferenceScreen().removePreference(pref);

}

}




原创粉丝点击