set custom font for text in PreferenceScreen
Solution 1
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>
Solution 2
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!
Solution 3
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);
}
}
Solution 4
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.
Sever
Updated on June 04, 2022Comments
-
Sever about 2 years
My PreferenceActivity looks like:
import android.os.Build; import android.os.Bundle; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; import android.widget.TextView; public class Settings extends PreferenceActivity { @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.about); Typeface timesFont = Typeface.createFromAsset(getAssets(), "fonts/times.ttf"); TextView about_txt = (TextView) findViewById(R.id.about_txt); about_txt.setTypeface(timesFont); about_txt.setText(R.string.about_txt); if (Build.VERSION.SDK_INT<Build.VERSION_CODES.HONEYCOMB) { addPreferencesFromResource(R.xml.preferences); } else { // Display the fragment as the main content. getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit(); } } public static class PrefsFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.preferences); } } }
And preference.xml
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <ListPreference android:dialogTitle="@string/size_dialog" android:entries="@array/size_list" android:entryValues="@array/entry_size" android:key="size_list" android:summary="@string/size_summary" android:title="@string/pref4title" /> </PreferenceCategory> <PreferenceCategory android:title="@string/pref_about" android:layout="@layout/about" > </PreferenceCategory> </PreferenceScreen>
@layout/about (about.xml):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/about_txt" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="some text here" /> </LinearLayout>
I have specific language, so for text in about.xml I should use specific font. Regularly for TextView I use:
Typeface timesFont = Typeface.createFromAsset(getAssets(), "fonts/times.ttf"); TextView about_txt = (TextView) findViewById(R.id.about_txt); about_txt.setTypeface(timesFont); about_txt.setText(R.string.about_txt);
but what I should use to access to text in about.xml which add to prefernce screen ?
Thanks in advance!
-
Sever over 11 yearsThank you for fast answer, but when I "extends Preference" instead of "PreferenceActivity", then inpossible to use addPreferencesFromResource. Or maybe I do something wrong?
-
Yahor10 over 11 yearsPut custom preference into your PreferenceActivity
-
Sever over 11 yearsI put "new CustomPreference(this)" in PreferenceActivity after "super.onCreate(savedInstanceState)" but nothing is changed. Also I add change onBindView(View view) {super.onBindView(view);Typeface timesFont =Typeface.createFromAsset(this.context.getAssets(), "fonts/times.ttf"); TextView about_txt = (TextView) view.findViewById(android.R.id.title); about_txt.setTypeface(timesFont);} but no effect
-
Yahor10 over 11 yearsCustomPreference is the ui element - you should call it (CustomPreference) findPreference();
-
Sever over 11 yearsCan you, please, update your post with right way to call CustomPreference and change font...because everything that I try not work
-
Sever over 11 yearsThank you, thank you very much, you help me a lot. Thank you for your time. I understand now where I made a mistake.
-
Dr. aNdRO over 10 yearsClassCastException is there in findPreference(); What to do now?
-
Hiren Dabhi over 7 yearsThanks for the easy solution. Custom font applied on all text except
summary
ofListPreference
. Do you know how to changesummary
font? -
dasfima over 5 years@Nolesh's solution works great with the summary field as well, and is a bit nicer solution.