set custom font for text in PreferenceScreen

后端 未结 4 813
独厮守ぢ
独厮守ぢ 2020-12-15 00:08

My PreferenceActivity looks like:

import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceActivity;
import android.preference.         


        
相关标签:
4条回答
  • 2020-12-15 00:47

    The easiest way to change typeface for all TextViews in PreferenceScreen is:

    public class WallpaperSettings extends PreferenceActivity {
    
      private View tryInflate(String name, Context context, AttributeSet attrs) {
        LayoutInflater li = LayoutInflater.from(context);
        View v = null;
        try {
            v = li.createView(name, null, attrs); 
        } catch (Exception e) {
            try {
                v = li.createView("android.widget." + name, null, attrs);
            } catch (Exception e1) {
            }
        }
        return v;
      }
    
      protected void onCreate(Bundle savedInstanceState) {
        //CHANGE TYPEFACE FOR ALL TEXTVIEWS
        final Typeface font = Typeface.createFromAsset(getAssets(), "fonts/cabal.ttf");     
        getLayoutInflater().setFactory(new Factory() {
            @Override
            public View onCreateView(String name, Context context,
                    AttributeSet attrs) {
                View v = tryInflate(name, context, attrs);
                if (v instanceof TextView) {                    
                    ((TextView) v).setTypeface(font);
                }
                return v;
            }
        });
    
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.prefs);
      }
    }
    

    That's it!

    0 讨论(0)
  • 2020-12-15 00:49

    With the addition of font support in android O, we can now set a font-family to app theme and that would automatically reflect in the PreferenceFragment as well. (Note: I am using PreferenceFragmentCompat). First add a font-family to the resources like this:

    <font-family xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <font
        android:fontStyle="normal"
        android:fontWeight="400"
        android:font="@font/nunito"
    
        app:fontStyle="normal"
        app:fontWeight="400"
        app:font="@font/nunito"/>
    
    <font
        android:fontStyle="italic"
        android:fontWeight="400"
        android:font="@font/nunito_italic"
    
        app:fontStyle="italic"
        app:fontWeight="400"
        app:font="@font/nunito_italic" />
    

    NOTE: You would need both app and android namespace declarations as of now Link

    Then add a style for the text view mentioning this font-family for the TextView:

    <style name="NunitoTextViewStyle" parent="android:Widget.TextView">
        <item name="android:fontFamily">@font/nunito_regular_font_family</item>
    </style>
    

    And then finally, just refer to the above style in your AppTheme like this:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        ........
        <item name="android:textViewStyle">@style/NunitoTextViewStyle</item>
    </style>
    

    Done. This will show the customised font in your PreferenceFragmentCompat as well.

    0 讨论(0)
  • 2020-12-15 00:51

    Maybe more easy to write your own Preference and add it in xml
    just set the custom font via Spannable to the settings fields:
    (looks long but fast done :))

    complete solution:

    private void convertPreferenceToUseCustomFont(Preference somePreference) {
        CustomTypefaceSpan customTypefaceSpan = new CustomTypefaceSpan("", net.mikekober.myMory.utils.Utils.getUsedTypeFace(getActivity()));
    
        SpannableStringBuilder ss;
        if (somePreference.getTitle() != null) {
            ss = new SpannableStringBuilder(somePreference.getTitle().toString());
            ss.setSpan(customTypefaceSpan, 0, ss.length(),Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
            somePreference.setTitle(ss);
        }
    
        if (somePreference.getSummary() != null) {
            ss = new SpannableStringBuilder(somePreference.getSummary().toString());
            ss.setSpan(customTypefaceSpan, 0, ss.length(),Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
            somePreference.setSummary(ss);
        }
    }
    

    call it for every preference and you're done :)

    have fun && good luck

    btw: on changing text, call it again!!
    btw2: checked, seen, applied, improved ;) from: https://stackoverflow.com/a/10741161/371749

    btw3, nearly forgot:

    static private class CustomTypefaceSpan extends TypefaceSpan {
    
        private final Typeface newType;
    
        public CustomTypefaceSpan(String family, Typeface type) {
            super(family);
            newType = type;
        }
    
        @Override
        public void updateDrawState(TextPaint ds) {
            applyCustomTypeFace(ds, newType);
        }
    
        @Override
        public void updateMeasureState(TextPaint paint) {
            applyCustomTypeFace(paint, newType);
        }
    
        private static void applyCustomTypeFace(Paint paint, Typeface tf) {
            int oldStyle;
            Typeface old = paint.getTypeface();
            if (old == null) {
                oldStyle = 0;
            } else {
                oldStyle = old.getStyle();
            }
    
            int fake = oldStyle & ~tf.getStyle();
            if ((fake & Typeface.BOLD) != 0) {
                paint.setFakeBoldText(true);
            }
    
            if ((fake & Typeface.ITALIC) != 0) {
                paint.setTextSkewX(-0.25f);
            }
    
            paint.setTypeface(tf);
        }
    }
    
    0 讨论(0)
  • 2020-12-15 00:55
    public class CustomPreference extends Preference 
        implements PreferenceStyle {
    
        private int style;
    
        public CustomPreference(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
    
        }
    
        public CustomPreference(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public CustomPreference(Context context) {
            super(context);
        }
    
        @Override
        protected void onBindView(View view) {
            super.onBindView(view);
            switch (style) {
            case STYLE_ALARMED:
                setStyleAlarmed(view);
                break;
            case STYLE_NORMAL:
                setStyleNormal(view);
                break;
            case STYLE_WARNING:
                setStyleWarning(view);
                break;
            case STYLE_SUMMARY_ALARM:
                setStyleSummaryAlarm(view);
                break;
            case STYLE_SUMMARY_WARNING:
                setStyleSummaryWarning(view);
                break;
            case STYLE_DISABLED:
                setStyleDisabled(view);
                break;
            default:
                break;
            }
    
        }
    
    private void setStyleWarning(View view) {
        TextView titleView = (TextView) view.findViewById(android.R.id.title);
        titleView.setTextColor(Color.YELLOW);
                // add your FONT here
    }
    
    private void setStyleAlarmed(View view) {
        int alarmREDColor = view.getContext().getResources().getColor(R.color.alarmed_red);
        TextView titleView = (TextView) view.findViewById(android.R.id.title);
        titleView.setTextColor(alarmREDColor);
    }
    
    public void setStyle(int style) {
            switch (style) {
            case STYLE_ALARMED:
                this.style = STYLE_ALARMED;
                break;
            case STYLE_NORMAL:
                this.style = STYLE_NORMAL;
                break;
            default:
                this.style = STYLE_NORMAL;
            }
        }
    
    public interface PreferenceStyle {
    
        public static final int STYLE_DISABLED = 0;
        public static final int STYLE_NORMAL = 10;
        public static final int STYLE_ALARMED = 20;
        public static final int STYLE_WARNING = 30;
    
        public static final int STYLE_SUMMARY_ALARM = 40;
        public static final int STYLE_SUMMARY_WARNING = 50;
    
        public void setStyle(int style);
        public Context getContext();
        public void setSummary(CharSequence summary);
    
    }
    

    public class YourActivity extends PreferenceActivity {
    
        private CustomPreference pref1;
        private CustomPreference pref2;
        private CustomPreference pref3;
    
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);         
            addPreferencesFromResource(R.xml.prefence_xml);
            pref1 = findPreference();
                        pref1.setOnPreferenceClickListener(this);
                        pref1.setStyle(PreferenceStyle.STYLE_NORMAL);
                   }
            }
    

    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    
    
        <PreferenceCategory 
            android:title="category1">
    
            <com.project.main.preference.CustomPreference 
                android:key="key"
                android:title="title"
                />  
    
            <com.project.main.preference.CustomPreference 
                android:key="key"
                android:title="title"/>
    
        </PreferenceCategory>
    
    </PreferenceScreen>
    
    0 讨论(0)
提交回复
热议问题