感谢: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. django中的view测试和models测试样例

    感觉用model_mommy比factory_boy要好些. 如果Models.py如下: from django.db import models from django.contrib.auth. ...

  2. Spring Cloud微服务视频教程-百度云

    Spring Cloud微服务视频教程-百度云 链接:https://pan.baidu.com/s/1mp8SkxNw7EfoTDtDKQMpIA 提取码: 关注公众号[GitHubCN]回复521 ...

  3. 搭建项目vue + vue-router + vuex + vue-i18n + element-ui + egg + sequelize

    vue + vue-router + vuex + vue-i18n + element-ui + egg + sequelize https://www.cnblogs.com/wuguanglin ...

  4. 【AtCoder】AGC020

    A - Move and Win 题解 看两个人相遇的时候谁先手即可,相遇之后第一个移动的人必输 代码 #include <bits/stdc++.h> #define fi first ...

  5. 【BZOJ】3640: JC的小苹果

    题解 我们考虑列出期望方程组,\(dp[i][j]\)表示在第\(i\)个点血量为\(j\)的时候到达\(N\)点的概率,所有的\(dp[N][j]\)都是1,所有\(j < 0\)都是0 答案 ...

  6. homestead实现外部局域网络其他主机的访问

    转载自:https://blog.csdn.net/u013659696/article/details/78455362 homestead 2.0 MAC环境 修改Homestead目录下的Vag ...

  7. 高能天气——团队Scrum冲刺阶段-Day 4

    高能天气--团队Scrum冲刺阶段-Day 4 今日完成任务 于欣月:基本实现课程表功能:每一个设置课程表的地方设置一个EditText和一个TextView,根据我们学校的课程情况设置了25个Edi ...

  8. 004.MySQL主库手动复制至从库

    一 主库手动复制至从库 1.1 Master主库锁表 mysql> flush tables with read lock; Query OK, 0 rows affected (0.00 se ...

  9. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

  10. gdb 调试及优化

    调试程序时,在gdb内p var,会提示 No symbol "var" in current context. 即使没有使用任何编译优化选项,仍然不能查看,可能是这些变量被优化到 ...