[英]set custom font for text in PreferenceScreen
My PreferenceActivity looks like:我的 PreferenceActivity 看起来像:
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和首选项.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): @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.我有特定的语言,所以对于 about.xml 中的文本,我应该使用特定的字体。 Regularly for TextView I use:
我经常为 TextView 使用:
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 ?但是我应该使用什么来访问 about.xml 中添加到首选项屏幕的文本?
Thanks in advance!提前致谢!
Maybe more easy to write your own Preference and add it in xml也许更容易编写自己的首选项并将其添加到 xml 中
just set the custom font via Spannable to the settings fields :只需通过 Spannable将自定义字体设置为设置字段:
(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 btw2:检查,看到,应用,改进;)来自: https ://stackoverflow.com/a/10741161/371749
btw3, nearly forgot: btw3,差点忘了:
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);
}
}
The easiest way to change typeface for all TextViews
in PreferenceScreen
is:更改
PreferenceScreen
所有TextViews
字体的最简单方法是:
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!而已!
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>
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.通过在 android O 中添加字体支持,我们现在可以为应用主题设置一个
font-family
,这也会自动反映在PreferenceFragment
中。 (Note: I am using PreferenceFragmentCompat
). (注意:我正在使用
PreferenceFragmentCompat
)。 First add a font-family
to the resources like this:首先向资源中添加一个
font-family
,如下所示:
<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注意:您现在需要
app
和android
命名空间声明链接
Then add a style
for the text view mentioning this font-family
for the TextView
:然后为文本视图添加一个
style
,提到TextView
这个font-family
:
<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:最后,在你的
AppTheme
引用上述style
,如下所示:
<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.这也将在您的
PreferenceFragmentCompat
显示自定义字体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.