感谢: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的样式的更多相关文章

  1. WPF 自定义Button控件及样式

    这次通过最近做的小例子说明一下自定义Button控件和样式. 实现的效果为:

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

    Android中想要去自定义ActionBar的背景色等样式. [折腾过程] 1.自己找代码,发现对应的配置的地方了: AndroidManifest.xml ? 1 2 <applicatio ...

  3. 微信小程序 修改(自定义) 单选/复选按钮样式 checkbox/radio样式自定义

    参考文章: 微信小程序 修改(自定义) 单选/复选按钮样式 checkbox/radio样式自定义

  4. PreferenceActivity、PreferenceFragment使用

    文件夹 文件夹 前言 PreferenceActivity preferences_scenario_1xml Preference Activity 演示 PreferenceFragment xm ...

  5. 关于Angular+ngx-perfect-scrollbar自定义各大浏览器滚动条样式的解决方法

    资料: http://manos.malihu.gr/jquery-custom-content-scroller/  (此项是结合Jquery使用的,在此并未采用) https://www.npmj ...

  6. 论如何在手机端web前端实现自定义原生控件的样式

    手机开发webapp的同学一定遇到过这样问题,如何为丑极了的手机元素应用自定义的样式.首先,要弄清楚为什么要定义手机原生控件的样式,就需要看看手机的那些原生框样式的丑陋摸样: android: ios ...

  7. [k]自定义上传文件按钮样式

    <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 自定义input[type="radio"]的样式

    对于表单,input[type="radio"] 的样式总是不那么友好,在不同的浏览器中表现不一. 为了最大程度的显示出它们的差别,并且为了好看,首先定义了一些样式: <fo ...

  9. 自定义input[type="file"]的样式

    input[type="file"]的样式在各个浏览器中的表现不尽相同: 1. chrome: 2. firefox: 3. opera: 4. ie: 5. edge: 另外,当 ...

随机推荐

  1. 【LOJ】#2511. 「BJOI2018」双人猜数游戏

    题解 设\(f[p][a][b]\)表示询问了\(p\)次,答案是\(a,b\)是否会被猜出来 然后判断如果\(p = 1\) 第一个问的\(Alice\),那么\([s,\sqrt{nm}]\)约数 ...

  2. Java参数传值?or传引用?

    O'Reilly's Javain a Nutshell by David Flanagan (see Resources) puts it best: "javamanipulates o ...

  3. Vue.js学以致用之遇到的那些坑

    前段时间的react授权许可的闹剧告诉大家一个问题,只有自己的东西用着才放心.各大巨头也逐渐明白使用自家东西的优势.本来vue的生态就愈加火热,这次的闹剧无疑又加速了vue的发展.当下,国内越来越多的 ...

  4. 在ssh中利用Solr服务建立的界面化站内搜索

         继上次匆匆搭建起结合solr和nutch的所谓站内搜索引擎之后,虽当时心中兴奋不已,可是看了看百度,再只能看看我的控制台的打印出每个索引项的几行文字,哦,好像差距还是有点大……      简 ...

  5. react初始化阶段

    初始化阶段可以使用的函数:getDefaultProps:只调用一次,实例之间共享引用.只有在组件的第一个实例被初始化的时候,才会调用他,然后react会把这个函数的返回结果保存起来,从第二个实例开始 ...

  6. 【BZOJ 1180】 (LCT)

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 1078  Solved: 662 Descript ...

  7. 一键安装LNMP/LAMP

    安装步骤:1.使用putty或类似的SSH工具登陆VPS或服务器: 登陆后运行:yum install screen安装  screen screen -S lnmp创建一个名字为lnmp的会话 2. ...

  8. shell脚本调用C语言之字符串切分函数——strtok

    今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从shell脚本中插入一连串的日期,通过调用proc生成的可执行文件,将日期传入后台数据库,在数据库中进行计算.需要切分日期 ...

  9. VS2013发布网站删除.CS文件

    VS2013发布网站时,默认不删除.CS文件,想要删除的话,需要一些配置   1.在要发布的网站上右键,选择"发布网站". 2.在发布窗口中,会让你选择一个发布配置文件,没有的话点 ...

  10. 什么是NAS

    个人理解: 1.NAS本身不是一种传输协议,只是一个名词而已,就是一个网络储存. 2.NAS系统本身就是一个Linux,也不是什么发行版,就是在Linux下实现了网络储存. 3.NAS系统里面实现了很 ...