Android开发之PreferenceActivity和PreferenceFragment

本文深入讲解了Android中PreferenceActivity的四种集成控件:ListPreference、EditTextPreference、CheckBoxPreference和RingtonePreference的使用方法及属性介绍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在PreferenceActivity中,给我们提供了四个选项集成控件:ListPreference,EditTextPreference,CheckBoxPreference和RingtonePreference。

注意:

通过PreferenceActivity生成的XML文件,命名方式是定死了的,生成的XML文件在data/data/<工程名>/shared_prefs/下,名字为“<工程名>_Preference.xml”这是无法改变的。

1、PreferenceList的介绍:

api介绍:


有两个属性要注意:

android:entries: 设置的内容是我们在设置时看到的内容

android:entryValues:保存在preferences.xml中的值

其余属性同上。

使用如下:
//这个在String里面使用
<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>



//这个在xml里面使用(layout)
<ListPreference
    android:key="list_key"
    android:title="性别"
    android:entryValues="@array/array_sex_value"
    android:entries="@array/array_sex"
    android:dialogTitle="性别列表"
    android:summary="请选择您的性别"/>

 


activity:

package com.fluter.seer.flutertest;

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.support.annotation.Nullable;

public class SecondActivity extends PreferenceActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /* 放入设置版面文件
         * 在这里,R.xml.mylistperference可以看作是布局文件
         */
        /*
         * addPreferencesFromResource方法在Android3.0中就被弃用了
         * 但却没有替代方法
         * 谷歌的想法是,希望我们继承PreferenceFragment来实现默认选项页
         * 但是这太难了。真的
         */
        addPreferencesFromResource(R.xml.listperference);
    }
}

xml/listperference.xml

 注意,这个android:key的值也是Preference文件里面的XML“键”名
 android:title 大标题
 android:summary 标题下面的小字(这个要作为选项卡才有)
 android:entries 弹出的对话框中,列表显示的文本内容,注意哦,这里指定的是一个数组哦
 android:entryValues 与android:entries相对应的值
 android:defaultValue 当对应值不存在时的默认值
 android:dialogTitle 弹出的对话框中的标题信息
 更多的标签设置等你来发掘
 -->
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="screen_list"
    android:title="标题"
    android:summary="说明摘要"
    >
    <ListPreference
        android:key="myListPreference"
        android:title="标题"
        android:summary="说明摘要"
        android:entries="@array/list_entries"
        android:entryValues="@array/list_entries_value"
        android:dialogTitle="这里是弹出框"
        android:defaultValue="@string/deflault_list_entries_value"
        ></ListPreference>

</PreferenceScreen>

string.xml

<resources>
    <string name="app_name">FluterTest</string>
    <string name="deflault_list_entries_value">默认实现</string>
    <string-array name="list_entries">
     <item>陕西</item>
     <item>山西</item>
     <item>河北</item>
    </string-array>
    <string-array name="list_entries_value">
     <item>老师</item>
     <item>学生</item>
     <item>家长</item>
    </string-array>
</resources>

项目结构:

展示结果:

2、CheckBoxPreference的介绍

 

api介绍:


有两个属性要注意:

android:summaryOn:开启说明
android:summaryOff:关闭说明


<CheckBoxPreference
    android:key="check_key"
    android:title="自动保存进度条"
    android:summaryOn="自动保存:开启"
    android:summaryOff="自动保存:关闭"/>

 


 

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="screen_list"
    android:summary="说明摘要"
    android:title="标题" >

    <CheckBoxPreference
        android:key="medf"
        android:summaryOff="马尔代夫未被选中"
        android:summaryOn="马尔代夫被选中了"
        android:title="马尔代夫" >
    </CheckBoxPreference>
    <CheckBoxPreference
        android:key="mlqs"
        android:summaryOff="毛里求斯未被选中"
        android:summaryOn="毛里求斯被选中了"
        android:title="毛里求斯" >
    </CheckBoxPreference>
</PreferenceScreen>

activity修改:

package com.fluter.seer.flutertest;

import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.support.annotation.Nullable;

public class SecondActivity extends PreferenceActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /* 放入设置版面文件
         * 在这里,R.xml.mylistperference可以看作是布局文件
         */
        /*
         * addPreferencesFromResource方法在Android3.0中就被弃用了
         * 但却没有替代方法
         * 谷歌的想法是,希望我们继承PreferenceFragment来实现默认选项页
         * 但是这太难了。真的
         */
        addPreferencesFromResource(R.xml.checkbox);
    }
}

项目结构:

展示效果:

3、EditTextPreference的介绍

api介绍:


属性:

  android:dialogTitle 对话框标题
  android:key 标识key
  android:summary简要说明
  android:title标题



<EditTextPreference
    android:key="edt_key"
    android:title="填写用户名"
    android:summary="用户名不能为空"
    android:dialogTitle="输入您的用户名"
    android:defaultValue="默认值"
    android:dialogMessage="使用汉语"/>

xml/edittext.xml

<?xml version="1.0" encoding="utf-8"?>  
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"  
    android:key="edittext_screen"  
    android:summary="屏幕简要说明"  
    android:title="屏幕标题" >  
  
    <EditTextPreference  
        android:dialogTitle="输入您的名称:"  
        android:key="editWord"  
        android:defaultValue="im human"  
        android:summary="简要说明"  
        android:title="输入名称" >  
    </EditTextPreference>  
  
</PreferenceScreen>  

项目结构:

效果展示:

4 RingtonePreference 系统铃

api介绍:


android:ringtoneType 设置响铃模式,
主要包括ringtone、notification、alarm、all   
android:showSilent 是否显示静音  

<RingtonePreference
    android:ringtoneType="all"
    android:title="设置铃铛"
    android:summary="选择铃铛"
    android:key="ring_key"
    android:showDefault="true"
    android:showSilent="true" />

rating.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <RingtonePreference
        android:ringtoneType="all"
        android:title="设置铃铛"
        android:summary="选择铃铛"
        android:key="ring_key"
        android:showDefault="true"
        android:showSilent="true" />
</PreferenceScreen>

项目结构:

 

 

在activity里面的引用:

ringtonePreference = (RingtonePreference) findPreference("ring_key");
editTextPreference = (EditTextPreference) findPreference("edt_key");
listPreference = (ListPreference) findPreference("list_key");
checkBoxPreference = (CheckBoxPreference) findPreference("check_key");

事件监听总结: 

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;
    }
});

 

 

注意:从Android 3.0以后官方不再推荐直接让PreferenceActivity加载选项设置布局文件,而是建议使用PreferenceFragment

第一步:创建frgment

package com.example.m05_preffragment01;

 import android.os.Bundle;
import android.preference.PreferenceFragment;

public class PrefFragment extends PreferenceFragment {
     @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
         
         //从xml文件加载选项 
        addPreferencesFromResource(R.xml.preferences);
     }
 }

第二步:创建activity

package com.example.m05_preffragment01;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
 import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
     protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         
        //加载PrefFragment
         FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
         PrefFragment prefFragment = new PrefFragment();
         transaction.add(R.id.prefFragment, prefFragment);
         transaction.commit();
        
     }
    
 }

第三步:创建preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- 设置的类别 -->
    <PreferenceCategory
        android:key="mylocation"
        android:summary="我的位置"
        android:title="我的位置源" >
        <CheckBoxPreference
            android:key="wireless_network"
            android:summary="使用无线网络查看应用程序(例如Google地图)中的位置"
            android:title="使用无线网络" />
        <CheckBoxPreference
            android:key="gps_satellite_setting"
            android:summary="定位时,精确到街道级别(取消选择可节约电量)"
            android:title="启用GPS卫星设置" />
    </PreferenceCategory>
    
    <PreferenceCategory
        android:key="mymessage"
        android:summary="个人信息设置"
        android:title="个人信息设置" >
        <CheckBoxPreference
            android:key="yesno_save_individual_info"
            android:title="是否保存个人信息" />
        <EditTextPreference
            android:key="individual_name"
            android:summary="请输入真实姓名"
            android:title="姓名 " />
        <ListPreference
            android:entries="@array/cities"
            android:entryValues="@array/cities"
            android:key="mycity"
            android:summary="所属城市"
            android:title="所属城市" />
    </PreferenceCategory>

</PreferenceScreen>

监听事件onPreferenceTreeClick()方法:

package com.example.m05_preffragment01;

 import android.os.Bundle;
 import android.preference.CheckBoxPreference;
 import android.preference.EditTextPreference;
 import android.preference.Preference;
 import android.preference.PreferenceFragment;
 import android.preference.PreferenceScreen;
 
 public class PrefFragment extends PreferenceFragment {
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
         super.onCreate(savedInstanceState);
        
         //从xml文件加载选项 
        addPreferencesFromResource(R.xml.preferences);
    }
     
     @Override
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
            Preference preference) {
         //如果“保存个人信息”这个按钮被选中,将进行括号里面的操作
         if("yesno_save_individual_info".equals(preference.getKey())) {            
            CheckBoxPreference checkBoxPreference = (CheckBoxPreference)findPreference("yesno_save_individual_info");
             EditTextPreference editTextPreference = (EditTextPreference)findPreference("individual_name");
            //让editTextPreference和checkBoxPreference的状态保持一致
             editTextPreference.setEnabled(checkBoxPreference.isChecked());
        }
         // TODO Auto-generated method stub
         return super.onPreferenceTreeClick(preferenceScreen, preference);
     }
 }

展示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值