自定义PreferenceActivity和PreferenceFragment的样式

感谢:http://blog.csdn.net/luck_apple/article/details/7064004

这篇文章讲的是如何定义fragment的样式,基本布局都是从源码中弄过来的。通过设置布局文件的属性,让我们可以自定义preference的界面。

先来看看xml文件中的内容

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <PreferenceCategory
        android:layout="@layout/prefs_category_widget"
        android:title="第一个模块的标题" >

        <!-- 设置单选模块 -->
        <CheckBoxPreference
            android:icon="@drawable/appstore"
            android:key="checkbox_preference"
            android:layout="@layout/preference_item"
            android:summary="整个布局都是自定义的,包括图标、文字、点击效果和单选按钮"
            android:title="标题"
            android:widgetLayout="@layout/checkbox_preference_widget" />

        <MultiSelectListPreference
            android:layout="@layout/preference_item"
            android:entries="@array/floatColor"
            android:entryValues="@array/floatColor_value"
            android:key="multSelect_preference"
            android:summary="点击可以选择多个选项"
            android:title="多选列表" />

        <RingtonePreference
            android:layout="@layout/preference_item"
            android:key="ringtone_preference"
            android:summary="点击选择铃声"
            android:title="铃声选择列表" />

        <SwitchPreference
            android:layout="@layout/preference_item"
            android:key="switch_preference"
            android:summaryOff="已关闭"
            android:summaryOn="已开启"
            android:switchTextOff="close"
            android:switchTextOn="open"
            android:title="开关" />
    </PreferenceCategory>
    <PreferenceCategory
        android:layout="@layout/prefs_category_widget"
        android:title="第二个模块的标题" >

        <!-- 设置输入框模块 -->
        <EditTextPreference
            android:layout="@layout/preference_item"
            android:dialogIcon="@drawable/itunes"
            android:dialogTitle="dialog_title_edittext_preference"
            android:key="edittext_preference"
            android:negativeButtonText="cancel"
            android:positiveButtonText="ok"
            android:title="文本输入" />

        <!-- 选择列表模块 -->
        <ListPreference
            android:layout="@layout/preference_item"
            android:dialogTitle="dialog_title_list_preference"
            android:entries="@array/floatColor"
            android:entryValues="@array/floatColor_value"
            android:key="list_preference"
            android:summary="点击后会弹出一个单选列表来选择数据"
            android:title="列表选择框" />
    </PreferenceCategory>

    <!-- 点击后又启动一个fragment -->
    <PreferenceCategory
        android:layout="@layout/prefs_category_widget">

        <!--
             This PreferenceScreen tag sends the user to a new fragment of
             preferences.  If running in a large screen, they can be embedded
             inside of the overall preferences UI.

        -->
        <PreferenceScreen
            android:layout="@layout/preference_item"
            android:fragment="com.kale.shared.MainActivity$Prefs1FragmentInner"
            android:summary="点击后跳到另一个fragment_preference"
            android:title="另一个fragment_preference" >

            <!-- Arbitrary key/value pairs can be included for fragment arguments -->
            <extra
                android:name="someKey"
                android:value="somePrefValue" />
        </PreferenceScreen>

        <!--
             This PreferenceScreen tag sends the user to a completely different
             activity, switching out of the current preferences UI.

        -->
        <PreferenceScreen
            android:layout="@layout/preference_item"
            android:icon="@drawable/ic_launcher"
            android:summary="点击后跳转到 http://www.android.com"
            android:title="点击触发intent动作" >
            <intent
                android:action="android.intent.action.VIEW"
                android:data="http://www.android.com" />
        </PreferenceScreen>
    </PreferenceCategory>
    <PreferenceCategory
        android:layout="@layout/prefs_category_widget"
        android:title="第四个模块的标题" >
        <CheckBoxPreference
            android:layout="@layout/preference_item"
            android:icon="@drawable/ic_launcher"
            android:key="parent_checkbox_preference"
            android:summary="点击后才可以让子控件可操作"
            android:title="父选择控件"
            android:widgetLayout="@layout/checkbox_preference_widget" />

        <!-- The visual style of a child is defined by this styled theme attribute. -->
        <!-- 子控件关联父控件,如果父控件选中后子控件才可用 -->
        <!--  android:layout="?android:attr/preferenceLayoutChild" -->
        <CheckBoxPreference
            android:dependency="parent_checkbox_preference"
            android:icon="@drawable/calculator"
            android:key="child_checkbox_preference"
            android:layout="@layout/preference_item"
            android:title="子控件(依托于父控件)"
            android:widgetLayout="@layout/checkbox_preference_widget" />
    </PreferenceCategory>

</PreferenceScreen>

这里面和传统的内容设置都是一样的,但是我通过

android:layout="@layout/prefs_category_widget"
android:layout="@layout/preference_item"
android:widgetLayout="@layout/checkbox_preference_widget" 

这三个属性,让我们可以通过布局文件来定义视图

需要注意的是:这里面的id都是系统的,所以我们可以直接在原始的xml文件中设置属性,这对于我们之前的操作无影响。只是换了布局而已。prefs_category_widget



<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#ededed"
    android:orientation="vertical" >

    <!-- 这个id需要注意,要引用安卓源码中的 -->
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:src="#dadada" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:layout_marginBottom="13dp"
        android:src="#e2e2e2" />

    <TextView
        android:id="@android:id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="6dp"
        android:layout_marginBottom="2dp"
        android:textColor="#939393"
        android:textSize="14sp" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:src="#e9e9e9" />

</LinearLayout>

preference_item



<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/selector_item"
    android:gravity="center_vertical"
    android:minHeight="?android:listPreferredItemHeight"
    android:orientation="horizontal" >

    <ImageView
        android:id="@android:id/icon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="3dp"
        android:scaleType="fitStart"
        android:src="@drawable/appstore" />

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="4dp"
        android:layout_marginTop="4dp" >

        <TextView
            android:id="@android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:ellipsize="marquee"
            android:fadingEdge="horizontal"
            android:singleLine="true"
            android:text="title"
            android:textColor="#4d4d4d"
            android:textSize="18.0sp" />

        <TextView
            android:id="@android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="15dp"
            android:layout_toRightOf="@android:id/title"
            android:layout_toLeftOf="@android:id/widget_frame"
            android:maxLines="2"
            android:text="summary"
            android:textColor="#AAAAAA"
            android:textSize="14sp" />

        <LinearLayout
            android:id="@android:id/widget_frame"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginLeft="4dp"
            android:layout_centerVertical="true"
            android:gravity="center_vertical"
            android:orientation="vertical" >
        </LinearLayout>
    </RelativeLayout>

</LinearLayout>
checkbox_preference_widget
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这里放上系统的id -->
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:button="@drawable/selector_checkbox"
    android:clickable="false"
    android:focusable="false" 
我的主代码用的是android推荐的activity和fragment结合的方式来实现的
package com.kale.shared;

import java.util.List;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MainActivity extends PreferenceActivity {

    SharedPreferences sp;
    SharedPreferences.Editor editor;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //设置背景图,给activity设置后。所有fragment的背景都会改了,十分方便!
        getWindow().setBackgroundDrawable(getResources().getDrawable(R.drawable.bgColor));
        //setContentView(R.layout.activity_main); 这里就不能设置布局了

        sp = getSharedPreferences("kaleShared", MODE_PRIVATE);
        editor = sp.edit();
        editor.putString("KEY", "value");
        editor.commit();

        if (sp.contains("KEY")) {
            System.out.println("have a key");
        }

        ;
    }
    /**
     * Populate the activity with the top-level headers.
     */
    @Override
    public void onBuildHeaders(List<Header> target) {
        //下面我们从源码的角度来自己搭建整个布局,所以我们设置布局。整个布局里面用一个list,id是默认的@android:id/list
        setContentView(R.layout.preference_hearders_frame);
        loadHeadersFromResource(R.xml.preference_headers, target);
    }

    public static class Prefs0Fragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.customer_preferences);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.preference_hearders_frame, container, false);
            return v;
        }
    }

    /**
     * This fragment shows the preferences for the first header.
     */
    public static class Prefs1Fragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Make sure default values are applied.  In a real app, you would
            // want this in a shared function that is used to retrieve the
            // SharedPreferences wherever they are needed.
            PreferenceManager.setDefaultValues(getActivity(),R.xml.fx_setting, false);

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.fragmented_preferences);
        }
    }

   /**
     * This fragment contains a second-level set of preference that you
     * can get to by tapping an item in the first preferences fragment.
     */
    /**
     * @author:Jack Tony
     * @tips  :在第一个fragment中点击一个PreferenceScreen中的fragment对象启动的fragment
     * @date  :2014-8-4
     */
    public static class Prefs1FragmentInner extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Can retrieve arguments from preference XML.
            Log.i("args", "Arguments: " + getArguments());

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.fx_setting);
        }
    }

    /**
     * This fragment shows the preferences for the second header.
     */
    public static class Prefs2Fragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Can retrieve arguments from headers XML.
            Log.i("args", "Arguments: " + getArguments());

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.display_prefs);
        }
    }
}

源码下载:http://download.csdn.net/detail/shark0017/7717357


自定义PreferenceActivity和PreferenceFragment的样式

时间: 2024-10-08 12:16:18

自定义PreferenceActivity和PreferenceFragment的样式的相关文章

PreferenceActivity、PreferenceFragment使用

文件夹 文件夹 前言 PreferenceActivity preferences_scenario_1xml Preference Activity 演示 PreferenceFragment xml布局文件 Preference Fragment Preference Activity管理Fragment 适配 前言 转来转去又回到了Android,闲话少说.这里是參考Android原生的Settings应用来介绍一下PreferenceActivity.PreferenceFragment

Button 文字阴影,自定义图片,代码绘制样式,添加音效的方法

1.Button自己在xml文件中绑定监听器 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent&qu

Android学习笔记十二.深入理解LauncherActvity 之LauncherActivity、PreferenceActivity、PreferenceFragment

深入理解LauncherActvity 之LauncherActivity.PreferenceActivity.PreferenceFragment 从下图我们可以知道,LauncherActivity.PreferanceActivity均继承于ListActivity,其中LauncherActivity实现当列表界面列表项被点击时所对应的Acitvity被启动:PreferanceActivity实现一个程序参数设置.存储功能的Activity列表界面. 一.LauncherActivi

ProgressBar学习笔记,自定义横向进度条的样式(包含ActionBar上面的进度条)

 点显示进度条后→   android:max="100" 进度条的最大值 android:progress  进度条已经完成的进度值 android:progressDrawable 已经完成的进度条轨道显示的Drawable对象 indeterminateDrawable   设置绘制不显示进度的进度条的Drawable对象 android:indeterminate 设置为true,进度条不精准显示进度 android:indeterminateDuration  设置不精准显示

Android中自定义ActionBar的背景色等样式style

Android中想要去自定义ActionBar的背景色等样式. [折腾过程] 1.自己找代码,发现对应的配置的地方了: AndroidManifest.xml ? 1 2 <application     android:theme="@style/AppTheme" > 找到 /res/values/styles.xml 中的: ? 1 2 3 <style name="AppTheme" parent="@android:style/

自定义博客园主题样式

自定义博客园主题样式 基础实现 之前有记录自己自定义目录以及相关样式功能,感兴趣的可以看下 博客园如何设置目录生成&设置目录&设置标题背景色&修改标题背景色 在此基础上再加点捣鼓内容,实现主题样式透明化.增加侧边“分享”模块.标题级别显示设置 具体代码中会进行注释,可进行相应参考 内容比较粗略,将就看喽~ 透明化 效果 具体实现 ****************************************** 页面定制CSS代码 ************************

自定义input[type=&quot;checkbox&quot;]的样式

对复选框自定义样式,我们以前一直用的脚本来实现,不过现在可以使用新的伪类 :checkbox 来实现. 如果直接对复选框设置样式,那么这个伪类并不实用,因为没有多少样式能够对复选框起作用.不过,倒是可以基于复选框的勾选状态借助组合选择符来给其他元素设置样式. 很多时候,无论是为了表单元素统一,还是为了用户体验良好,我们都会选择 label 元素和 input[type="checkbox"] 一起使用.当<label>元素与复选框关联之后,也可以起到触发开关的作用. 思路:

自定义CheckBox的选中与否样式

我们在做APP应用时,经常要用到CheckBox控件,但是系统原有的CheckBox样式又不满足我们的需求,我们就要自定义CheckBox选中与否状态,其实就同Button一样,设置其选择与否背景即可. 布局如下: <CheckBox android:id="@+id/foot_mark_cb" android:layout_width="wrap_content" android:layout_height="wrap_content"

自定义input[type=&quot;file&quot;]的样式

input[type="file"]的样式在各个浏览器中的表现不尽相同: 1. chrome: 2. firefox: 3. opera: 4. ie: 5. edge: 另外,当我们规定 input[type="file"] 的高度,并把它的行高设置成与其高度相等后,chrome中难看的样式出现了: “未选择任何文件”这一行并没有竖直居中. 似乎在 firefox 中好看一些,嗯,我比较喜欢用 firefox.但是这些浏览器中的表现不一致,我们必须做兼容处理. 思