更改preferenceFragment背景颜色 [英] Change the background color of PreferenceFragment

查看:612
本文介绍了更改preferenceFragment背景颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用 preferenceFragment 与它的XML文件如下

 公共类阅读器preferences扩展preferenceFragment {
 @覆盖
 公共无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    加preferencesFromResource(R.xml preference。);
 }
}
 

preference.xml:

 < preferenceCategory
    机器人:关键=一般
    机器人:标题=常规&GT​​;

    <复选框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:机器人=htt​​p://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:机器人=htt​​p://schemas.android.com/apk/res/android机器人:标题=Android的定制preFS测试>
        < preference机器人:标题=preference片段机器人:总结=使用自定义背景的Andr​​oid版本:键=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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆