更改preferenceFragment背景颜色 [英] Change the background color of PreferenceFragment
问题描述
我用 preferenceFragment
与它的XML文件如下
公共类阅读器preferences扩展preferenceFragment {
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
加preferencesFromResource(R.xml preference。);
}
}
preference.xml:
< preferenceCategory
机器人:关键=一般
机器人:标题=常规>
<复选框preference
安卓:设置defaultValue =真
机器人:关键=notify_me
机器人:总结=关于这一天的通知,报价时通知我
机器人:标题=获得通知/>
< preference
安卓:设置defaultValue =
机器人:关键=时间
机器人:总结=更改时间来接收每日新闻
机器人:标题/&GT =每日报价时间;
< / preferenceCategory>
< preferenceCategory
机器人:关键=社交
机器人:标题=社交活动,共享>
< preference
安卓:设置defaultValue =
机器人:关键=facebook_login
机器人:总结=请使用您的Facebook帐户
机器人:标题=Facebook登录/>
< preference
安卓:设置defaultValue =
机器人:关键=facebook_logout
机器人:总结=退出Facebook的
机器人:标题=Facebook的注销/>
<复选框preference
安卓:设置defaultValue =
机器人:关键=facebook_qotd
机器人:总结=分享当天的报价在Facebook一旦更新
机器人:标题=Facebook分享QOTD/>
< preference
安卓:设置defaultValue =
机器人:关键=twitter_login
机器人:总结=拍在与你的Twitter帐户
机器人:标题=微博登陆/>
< preference
安卓:设置defaultValue =
机器人:关键=twitter_logout
机器人:总结=退出微博
机器人:标题=微博注销/>
<复选框preference
安卓:设置defaultValue =
机器人:关键=twitter_qotd
机器人:总结=分享当天的报价在Twitter上一旦更新
机器人:标题=在twitter上分享QOTD/>
< / preferenceCategory>
< preferenceCategory
机器人:关键=其它
机器人:标题=其他>
< preference
安卓:设置defaultValue =
机器人:关键=约
机器人:标题=关于/>
< / preferenceCategory>
我怎样才能改变这种preference的背景颜色? 而如何从.TTF文件中设置字体?
希望有人能帮助我。 先谢谢了。
这是一个方法:你可以创建自己的prefrenceFragment与自定义布局和ListView。基本上它是一个简单的片段,返回查看包含的ListView。通过调用preferenceScreen bind()方法可以膨胀preferenceScreen内容,以自己的ListView
公共无效绑定(ListView控件的ListView)
加在API级别1绑定一个ListView包含在preferences 通过getRootAdapter这个preferenceScreen()。它也处理传球 列表项单击包含此相应的preference preferenceScreen。参数的ListView列表视图附加到。
公共类定制preferenceFragment延伸片段{
自preferenceFragment.java
私人preferenceManager米preferenceManager;
/ **
*给出了以preference框架出发请求code。
* /
私有静态最终诠释FIRST_REQUEST_ code = 100;
私有静态最终诠释MSG_BIND_ preFERENCES = 0;
私人处理程序mHandler =新的处理程序(){
@覆盖
公共无效的handleMessage(信息MSG){
开关(msg.what){
案例MSG_BIND_ preFERENCES:
绑定preferences();
打破;
}
}
};
私人的ListView LV;
私人诠释xmlId;
//必须提供
市民自preferenceFragment(){
}
@覆盖
公共无效onDestroyView(){
super.onDestroyView();
ViewParent p值= lv.getParent();
如果(P!= NULL)
((ViewGroup中)P).removeView(LV);
}
@覆盖
公共查看onCreateView(LayoutInflater充气,ViewGroup中根,包savedInstanceState){
捆绑包= getArguments();
如果(捆绑!= NULL){
xmlId = bundle.getInt(XML);
}
查看MVIEW = inflater.inflate(R.layout preference_list_content,空);
米preferenceManager =的onCreate preferenceManager();
LV =(ListView控件)mView.findViewById(R.id.listView1);
lv.setBackgroundColor(Color.WHITE);
lv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
加preferencesFromResource(xmlId);
setHasOptionsMenu(真正的);
postBind preferences();
返回MView的;
}
@覆盖
公共无效的onStop(){
super.onStop();
尝试{
方法米= preferenceManager.class.getDeclaredMethod(dispatchActivityStop);
m.setAccessible(真正的);
m.invoke(M preferenceManager);
}赶上(例外五){
e.printStackTrace();
}
}
@覆盖
公共无效的onDestroy(){
super.onDestroy();
LV = NULL;
尝试{
方法米= preferenceManager.class.getDeclaredMethod(dispatchActivityDestroy);
m.setAccessible(真正的);
m.invoke(M preferenceManager);
}赶上(例外五){
e.printStackTrace();
}
}
@覆盖
公共无效的onSaveInstanceState(包outState){
outState.putInt(XML,xmlId);
super.onSaveInstanceState(outState);
}
@覆盖
公共无效onCreateOptionsMenu(功能菜单,MenuInflater充气){
inflater.inflate(R.menu.main,菜单);
super.onCreateOptionsMenu(菜单,充气);
}
@覆盖
公共无效onActivityResult(INT申请code,INT结果code,意图数据){
super.onActivityResult(要求code,因此code,数据);
尝试{
方法M = preferenceManager.class.getDeclaredMethod(dispatchActivityResult,int.class,int.class,Intent.class);
m.setAccessible(真正的);
m.invoke(M preferenceManager,请求code,因此code,数据);
}赶上(例外五){
e.printStackTrace();
}
}
/ **
*发布消息到preferences绑定到列表视图。
*所述p为H.;
*后期绑定是pferred在创建任何自定义preference类型$ P $
* {@link #onCreate(包)}都能够有自己的看法回收。
* /
私人无效postBind preferences(){
如果(mHandler.hasMessages(MSG_BIND_ preFERENCES))回报;
mHandler.obtainMessage(MSG_BIND_ preFERENCES).sendToTarget();
}
私人无效绑定preferences(){
最后preferenceScreen preferenceScreen = GET preferenceScreen();
如果(preferenceScreen!= NULL){
preferenceScreen.bind(LV);
}
}
/ **
*创建{@link preferenceManager}。
*
* @返回{@link preferenceManager}使用此活动。
* /
私人preferenceManager的onCreate preferenceManager(){
尝试{
构造函数和LT; preferenceManager> C = preferenceManager.class.getDeclaredConstructor(Activity.class,int.class);
c.setAccessible(真正的);
preferenceManager preferenceManager = c.newInstance(this.getActivity(),FIRST_REQUEST_ code);
返回preferenceManager;
}赶上(例外五){
e.printStackTrace();
返回null;
}
}
/ **
*返回{@link preferenceManager}使用此活动。
* @返回{@link preferenceManager}。
* /
公共preferenceManager的get preferenceManager(){
返回米preferenceManager;
}
/ **
*设置,这个活动是显示了preference层次的根。
*
*参数preferenceScreen的preference层次的根{@link preferenceScreen}。
* /
公共无效套preferenceScreen(preferenceScreen preferenceScreen){
尝试{
方法M = preferenceManager.class.getDeclaredMethod(设置preferences,preferenceScreen.class);
m.setAccessible(真正的);
布尔结果=(布尔)m.invoke(M preferenceManager,preferenceScreen);
如果(结果和安培;&安培;!preferenceScreen = NULL){
postBind preferences();
}
}赶上(例外五){
e.printStackTrace();
}
}
/ **
*获取这一活动是显示了preference层次的根。
*
* @返回{@link preferenceScreen}是的preference根
*层次。
* /
公共preferenceScreen的get preferenceScreen(){
尝试{
方法M = preferenceManager.class.getDeclaredMethod(得到preferenceScreen);
m.setAccessible(真正的);
返程(preferenceScreen)m.invoke(M preferenceManager);
}赶上(例外五){
e.printStackTrace();
返回null;
}
}
/ **
*膨胀给定的XML资源,并增加了preference层次到目前
* preference层次。
*
*参数preferencesResId XML资源ID膨胀。
* /
公共无效添加preferencesFromResource(INT preferencesResId){
尝试{
方法M = preferenceManager.class.getDeclaredMethod(inflateFromResource,Context.class,int.class,preferenceScreen.class);
m.setAccessible(真正的);
preferenceScreen prefScreen =(preferenceScreen)m.invoke(M preferenceManager,getActivity(),preferencesResId,拿到preferenceScreen());
集preferenceScreen(prefScreen);
}赶上(例外五){
e.printStackTrace();
}
}
/ **
*找到了{@link preference}根据其关键。
*
* @参数关键的preference的键来检索。
* @返回{@link preference}的键,则返回null。
* @see preferenceGroup#找到preference(CharSequence中)
* /
公共preference发现preference(CharSequence的键){
如果(M preferenceManager == NULL){
返回null;
}
返回米preferenceManager.find preference(键);
}
}
preference_list_content.xml //您的自定义的ListView /布局
< XML版本=1.0编码=UTF-8&GT?;
< RelativeLayout的的xmlns:机器人=http://schemas.android.com/apk/res/android
机器人:layout_width =FILL_PARENT
机器人:layout_height =FILL_PARENT>
<的ListView
机器人:ID =@ + ID / ListView1的
机器人:layout_width =match_parent
机器人:layout_height =WRAP_CONTENT
机器人:layout_alignParentLeft =真
机器人:layout_alignParentTop =真正的>
< / ListView控件>
< / RelativeLayout的>
示例如何使用:
MainActivity.java
公共类MainActivity扩展活动实现OnShared preferenceChangeListener {
私人共享preferences共享preF;
私人定制preferenceFragment FRAG;
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
FRAG =新的自定义preferenceFragment();
束束=新包();
bundle.putInt(XML,R.xml preFS); //你的$ P要夸大$ pference XML
frag.setArguments(包);
。getFragmentManager()的BeginTransaction()加(R.id.frameLayout,FRAG).commit();
共享preF = preferenceManager.getDefaultShared preferences(本);
}
@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
//充气菜单;这增加了项目操作栏,如果它是present。
。getMenuInflater()膨胀(R.menu.main,菜单);
返回true;
}
@覆盖
公共无效onResume(){
super.onResume();
共享pref.registerOnShared preferenceChangeListener(本);
}
@覆盖
公共无效的onPause(){
super.onPause();
共享pref.unregisterOnShared preferenceChangeListener(本);
}
@覆盖
公共无效onShared preferenceChanged(共享preferences共享preferences,
字符串键){
Toast.makeText(这一点,preferences改变,键:+键,Toast.LENGTH_SHORT).show();
}
}
prefs.xml进入下RES / XML /文件夹:
< XML版本=1.0编码=UTF-8&GT?;
< preferenceScreen的xmlns:机器人=http://schemas.android.com/apk/res/android机器人:标题=Android的定制preFS测试>
< preference机器人:标题=preference片段机器人:总结=使用自定义背景的Android版本:键=key_1/>
<复选框preference机器人:标题=复选框preF机器人:总结=preference使用复选框安卓键=key_2/>
<开关preference机器人:标题=切换preference机器人:总结=prefrence带开关的Android:键=KEY_3/>
< / preferenceScreen>
我怎样才能改变这种preference的背景颜色?
在自定义preferenceFragment.java:
@覆盖
公共查看onCreateView(LayoutInflater充气,ViewGroup中根,包savedInstanceState){
lv.setBackgroundColor(Color.WHITE);
}
结果:
I'm using PreferenceFragment
with its xml file as following
public class ReaderPreferences extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preference);
}
}
preference.xml:
<PreferenceCategory
android:key="general"
android:title="General" >
<CheckBoxPreference
android:defaultValue="true"
android:key="notify_me"
android:summary="Notify me about quote of the day in notifications"
android:title="Get notification" />
<Preference
android:defaultValue=""
android:key="time"
android:summary="Change time to receive quote of the day"
android:title="Time of Quote of the day" />
</PreferenceCategory>
<PreferenceCategory
android:key="socials"
android:title="Socials and sharing" >
<Preference
android:defaultValue=""
android:key="facebook_login"
android:summary="Sign in with your facebook account"
android:title="Facebook login" />
<Preference
android:defaultValue=""
android:key="facebook_logout"
android:summary="Sign out facebook "
android:title="Facebook logout" />
<CheckBoxPreference
android:defaultValue=""
android:key="facebook_qotd"
android:summary="Share the quote of the day on facebook once it is updated"
android:title="Share QOTD on facebook" />
<Preference
android:defaultValue=""
android:key="twitter_login"
android:summary="Sign in with your twitter account"
android:title="Twitter login" />
<Preference
android:defaultValue=""
android:key="twitter_logout"
android:summary="Sign out twitter"
android:title="Twitter logout" />
<CheckBoxPreference
android:defaultValue=""
android:key="twitter_qotd"
android:summary="Share the quote of the day on twitter once it is updated"
android:title="Share QOTD on twitter" />
</PreferenceCategory>
<PreferenceCategory
android:key="other"
android:title="Other" >
<Preference
android:defaultValue=""
android:key="about"
android:title="About" />
</PreferenceCategory>
How can I change the background color of this preference? And how can I set the font from .ttf file?
Hope anyone can help me. Thanks in advance.
This is one approach: you can create your own PrefrenceFragment with custom layout and ListView. Basically its a simple Fragment that returns View that contains ListView. By calling PreferenceScreen bind() method you can inflate PreferenceScreen content to your own ListView
public void bind (ListView listView)
Added in API level 1 Binds a ListView to the preferences contained in this PreferenceScreen via getRootAdapter(). It also handles passing list item clicks to the corresponding Preference contained by this PreferenceScreen. Parameters listView The list view to attach to.
public class CustomPreferenceFragment extends Fragment {
CustomPreferenceFragment.java
private PreferenceManager mPreferenceManager;
/**
* The starting request code given out to preference framework.
*/
private static final int FIRST_REQUEST_CODE = 100;
private static final int MSG_BIND_PREFERENCES = 0;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_BIND_PREFERENCES:
bindPreferences();
break;
}
}
};
private ListView lv;
private int xmlId;
//must be provided
public CustomPreferenceFragment(){
}
@Override
public void onDestroyView(){
super.onDestroyView();
ViewParent p = lv.getParent();
if(p != null)
((ViewGroup)p).removeView(lv);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup root, Bundle savedInstanceState){
Bundle bundle = getArguments();
if(bundle != null){
xmlId = bundle.getInt("xml");
}
View mView = inflater.inflate(R.layout.preference_list_content, null);
mPreferenceManager = onCreatePreferenceManager();
lv = (ListView)mView.findViewById(R.id.listView1);
lv.setBackgroundColor(Color.WHITE);
lv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
addPreferencesFromResource(xmlId);
setHasOptionsMenu(true);
postBindPreferences();
return mView;
}
@Override
public void onStop(){
super.onStop();
try{
Method m = PreferenceManager.class.getDeclaredMethod("dispatchActivityStop");
m.setAccessible(true);
m.invoke(mPreferenceManager);
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
lv = null;
try{
Method m = PreferenceManager.class.getDeclaredMethod("dispatchActivityDestroy");
m.setAccessible(true);
m.invoke(mPreferenceManager);
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putInt("xml", xmlId);
super.onSaveInstanceState(outState);
}
@Override
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.main, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try{
Method m = PreferenceManager.class.getDeclaredMethod("dispatchActivityResult", int.class, int.class, Intent.class);
m.setAccessible(true);
m.invoke(mPreferenceManager, requestCode, resultCode, data);
}catch(Exception e){
e.printStackTrace();
}
}
/**
* Posts a message to bind the preferences to the list view.
* <p>
* Binding late is preferred as any custom preference types created in
* {@link #onCreate(Bundle)} are able to have their views recycled.
*/
private void postBindPreferences() {
if (mHandler.hasMessages(MSG_BIND_PREFERENCES)) return;
mHandler.obtainMessage(MSG_BIND_PREFERENCES).sendToTarget();
}
private void bindPreferences() {
final PreferenceScreen preferenceScreen = getPreferenceScreen();
if (preferenceScreen != null) {
preferenceScreen.bind(lv);
}
}
/**
* Creates the {@link PreferenceManager}.
*
* @return The {@link PreferenceManager} used by this activity.
*/
private PreferenceManager onCreatePreferenceManager() {
try{
Constructor<PreferenceManager> c = PreferenceManager.class.getDeclaredConstructor(Activity.class, int.class);
c.setAccessible(true);
PreferenceManager preferenceManager = c.newInstance(this.getActivity(), FIRST_REQUEST_CODE);
return preferenceManager;
}catch(Exception e){
e.printStackTrace();
return null;
}
}
/**
* Returns the {@link PreferenceManager} used by this activity.
* @return The {@link PreferenceManager}.
*/
public PreferenceManager getPreferenceManager() {
return mPreferenceManager;
}
/**
* Sets the root of the preference hierarchy that this activity is showing.
*
* @param preferenceScreen The root {@link PreferenceScreen} of the preference hierarchy.
*/
public void setPreferenceScreen(PreferenceScreen preferenceScreen){
try{
Method m = PreferenceManager.class.getDeclaredMethod("setPreferences", PreferenceScreen.class);
m.setAccessible(true);
boolean result = (Boolean) m.invoke(mPreferenceManager, preferenceScreen);
if (result && preferenceScreen != null) {
postBindPreferences();
}
}catch(Exception e){
e.printStackTrace();
}
}
/**
* Gets the root of the preference hierarchy that this activity is showing.
*
* @return The {@link PreferenceScreen} that is the root of the preference
* hierarchy.
*/
public PreferenceScreen getPreferenceScreen(){
try{
Method m = PreferenceManager.class.getDeclaredMethod("getPreferenceScreen");
m.setAccessible(true);
return (PreferenceScreen) m.invoke(mPreferenceManager);
}catch(Exception e){
e.printStackTrace();
return null;
}
}
/**
* Inflates the given XML resource and adds the preference hierarchy to the current
* preference hierarchy.
*
* @param preferencesResId The XML resource ID to inflate.
*/
public void addPreferencesFromResource(int preferencesResId) {
try{
Method m = PreferenceManager.class.getDeclaredMethod("inflateFromResource", Context.class, int.class, PreferenceScreen.class);
m.setAccessible(true);
PreferenceScreen prefScreen = (PreferenceScreen) m.invoke(mPreferenceManager, getActivity(), preferencesResId, getPreferenceScreen());
setPreferenceScreen(prefScreen);
}catch(Exception e){
e.printStackTrace();
}
}
/**
* Finds a {@link Preference} based on its key.
*
* @param key The key of the preference to retrieve.
* @return The {@link Preference} with the key, or null.
* @see PreferenceGroup#findPreference(CharSequence)
*/
public Preference findPreference(CharSequence key) {
if (mPreferenceManager == null) {
return null;
}
return mPreferenceManager.findPreference(key);
}
}
preference_list_content.xml //Your custom ListView/Layout
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ListView>
</RelativeLayout>
Example how to use:
MainActivity.java
public class MainActivity extends Activity implements OnSharedPreferenceChangeListener{
private SharedPreferences sharedPref;
private CustomPreferenceFragment frag;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
frag = new CustomPreferenceFragment();
Bundle bundle = new Bundle();
bundle.putInt("xml", R.xml.prefs); //Your preference xml that you want to inflate
frag.setArguments(bundle);
getFragmentManager().beginTransaction().add(R.id.frameLayout, frag).commit();
sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onResume(){
super.onResume();
sharedPref.registerOnSharedPreferenceChangeListener(this);
}
@Override
public void onPause(){
super.onPause();
sharedPref.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
String key) {
Toast.makeText(this, "Preferences changed, key: " + key, Toast.LENGTH_SHORT).show();
}
}
prefs.xml goes under res/xml/ folder:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" android:title="android custom prefs test">
<Preference android:title="Preference Fragment " android:summary="With custom background" android:key="key_1"/>
<CheckBoxPreference android:title="CheckBoxPref" android:summary="Preference with checkbox" android:key="key_2"/>
<SwitchPreference android:title="SwitchPreference" android:summary="Prefrence with switch" android:key="key_3"/>
</PreferenceScreen>
How can I change the background color of this preference?
In CustomPreferenceFragment.java:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup root, Bundle savedInstanceState){
lv.setBackgroundColor(Color.WHITE);
}
Result:
这篇关于更改preferenceFragment背景颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!