自定义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的样式的更多相关文章
- WPF 自定义Button控件及样式
这次通过最近做的小例子说明一下自定义Button控件和样式. 实现的效果为:
- Android中自定义ActionBar的背景色等样式style
Android中想要去自定义ActionBar的背景色等样式. [折腾过程] 1.自己找代码,发现对应的配置的地方了: AndroidManifest.xml ? 1 2 <applicatio ...
- 微信小程序 修改(自定义) 单选/复选按钮样式 checkbox/radio样式自定义
参考文章: 微信小程序 修改(自定义) 单选/复选按钮样式 checkbox/radio样式自定义
- PreferenceActivity、PreferenceFragment使用
文件夹 文件夹 前言 PreferenceActivity preferences_scenario_1xml Preference Activity 演示 PreferenceFragment xm ...
- 关于Angular+ngx-perfect-scrollbar自定义各大浏览器滚动条样式的解决方法
资料: http://manos.malihu.gr/jquery-custom-content-scroller/ (此项是结合Jquery使用的,在此并未采用) https://www.npmj ...
- 论如何在手机端web前端实现自定义原生控件的样式
手机开发webapp的同学一定遇到过这样问题,如何为丑极了的手机元素应用自定义的样式.首先,要弄清楚为什么要定义手机原生控件的样式,就需要看看手机的那些原生框样式的丑陋摸样: android: ios ...
- [k]自定义上传文件按钮样式
<!DOCTYPE HTML> <html> <head> <meta charset="UTF-8"> <title> ...
- 自定义input[type="radio"]的样式
对于表单,input[type="radio"] 的样式总是不那么友好,在不同的浏览器中表现不一. 为了最大程度的显示出它们的差别,并且为了好看,首先定义了一些样式: <fo ...
- 自定义input[type="file"]的样式
input[type="file"]的样式在各个浏览器中的表现不尽相同: 1. chrome: 2. firefox: 3. opera: 4. ie: 5. edge: 另外,当 ...
随机推荐
- CentOS 7安装图形化界面后重启出现Initial setup of CentOS Linux 7 (core)
这是CentOS内核的初始设置页面,下面给出中文解释及操作方法. 1.CentOS Linux 7 初始设置(核心) 1)[!]许可证信息 (没有接受许可证) 请您选择[‘1’ 输入许可证信息 | ‘ ...
- 【LOJ】#2117. 「HNOI2015」实验比较
题解 把所有=的点连起来,一个图合法肯定它是一个有向树森林 我们新建一个点,把这个点和其他所有树的树根连起来 定义\(dp[u][j]\)表示第u个点长度为j的序列的方案数 转移方法是 \(dp[u] ...
- Flume分布式日志收集系统
1.flume是分布式的日志收集系统,把收集来的数据传送到目的地去.2.flume里面有个核心概念,叫做agent.agent是一个java进程,运行在日志收集节点.通过agent接收日志,然后暂存起 ...
- OSNIT信息收集分析框架OSRFramework
OSNIT信息收集分析框架OSRFramework OSNIT是一种从公开的信息资源搜集信息的有效方式.Kali Linux集成了一款专用分析工具集OSRFramework.该工具集包含多个常用工具 ...
- python中的*和**参数传递机制
python的参数传递机制具有值传递(int.float等值数据类型)和引用传递(以字典.列表等非值对象数据类型为代表)两种基本机制以及方便的关键字传递特性(直接使用函数的形参名指定实参的传递目标,如 ...
- Redis 复制原理及分析
1.测试 见master-slave测试帖 2 原理 第一次.Slave向Master同步的实现是: Slave向Master发出同步请求(发送sync命令),Master先dump出rdb文件,然后 ...
- poj 3660 传递闭包 **
题意:题目给出了m对的相对关系,求有多少个排名是确定的. 链接:点我 如果这个点到其他点的关系是确定的,那么这个点就是确定的,注意如果这个点到不了其他点,但其他点能到这个点,那么这个点和其他点的关系是 ...
- jsp的9大内置对象和4大作用域
- String和StringBuilder、StringBuffer的区别?
估计很多Java初学者在学习Java的过程中都会遇到这个问题,那就是String,StringBuilder,StringBuffer这三个类之间有什么区别?今天在这里整理一下,希望对大家有帮助哈.如 ...
- Codeforces Round #258 (Div. 2) C. Predict Outcome of the Game 水题
C. Predict Outcome of the Game 题目连接: http://codeforces.com/contest/451/problem/C Description There a ...