0

我正在尝试更改 EditTextPreference fontFamily,以便使用自定义字体资源显示所有可见文本(包括首选项标题和对话框标题)。有什么建议么?我尝试在styles.xml 中建立一个fontFamily 以及创建一个自定义的EditTextPreference。谢谢!

作为参考,我附上了当前视图(注意工具栏标题和首选项小部件之间的字体差异): 设置页面

4

2 回答 2

0

此代码可以为您服务:

在活动中调用这个:

ViewGroup vg = (ViewGroup) getWindow().getDecorView();
CustomTypeface.setTypeFace(Typeface.createFromAsset(context.getAssets(), "helvetica.ttf"), vg);

并同意这种方法:

import android.graphics.Paint;
import android.graphics.Typeface;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.dlbz.pos.activity.menu.R;

public class CustomTypeface {
    public static void setTypeFace(Typeface typeFace, ViewGroup parent) {
        for (int i = 0; i < parent.getChildCount(); i++) {
            View v = parent.getChildAt(i);
            if (v instanceof ViewGroup) {
                setTypeFace(typeFace, (ViewGroup) v);
            } else if (v instanceof TextView) {
                TextView tv = (TextView) v;
                tv.setTypeface(typeFace);
                tv.setPaintFlags(tv.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
            } else if (v instanceof Button) {
                Button btn = (Button) v;
                btn.setTypeface(typeFace);
                btn.setPaintFlags(btn.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
            } else if (v instanceof EditText) {
                EditText et = (EditText) v;
                et.setTypeface(typeFace);
                et.setPaintFlags(et.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
            }
        }
    }
}

此方法将所有字体更改为在视图组中查看

于 2018-08-28T22:20:47.610 回答
0

幸运的是,我设法找到了我的问题的答案。该解决方案涉及创建自定义布局并在我的preferences.xml 文件中引用它。以下是它是如何崩溃的:

首选项.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" 
android:fragment="com.app_name.fragment">
    <EditTextPreference
        android:id="@+id/key_Edit"
        android:clickable="true"
        android:inputType="textCapCharacters|textMultiLine"
        android:enabled="true"
        android:gravity="top"
        android:key="pref_phrase"
        android:singleLine="true"
        android:textAlignment="center"
        android:title="@string/preference_key"
        android:defaultValue=" "
        android:selectAllOnFocus="true"
        android:fontFamily="@font/my_font"
        android:textColor="@color/colorPrimary"
        android:layout="@layout/preference_layout"/>
    <EditTextPreference
        android:id="@+id/password_Edit"
        android:gravity="top"
        android:key="pref_password"
        android:selectAllOnFocus="true"
        android:singleLine="true"
        android:textAlignment="center"
        android:title="@string/preference_security"
        android:defaultValue=" "
        android:inputType="number"
        android:maxLength="5"
        android:fontFamily="@font/my_font"
        android:textColor="@color/colorPrimary"
        android:layout="@layout/preference_layout"/>
</PreferenceScreen>

偏好布局.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="?attr/listPreferredItemHeight"
    android:paddingEnd="?attr/listPreferredItemPaddingRight"
    android:paddingLeft="?attr/listPreferredItemPaddingLeft"
    android:paddingRight="?attr/listPreferredItemPaddingRight"
    android:paddingStart="?attr/listPreferredItemPaddingLeft">
    <android.support.constraint.ConstraintLayout
        android:id="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">
        <TextView
            android:id="@android:id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="@font/my_font"
            android:textAppearance="@style/TextAppearance.AppCompat.Medium"
            android:textColor="@color/colorPrimary"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@id/layout" />
        <TextView
            android:id="@android:id/summary"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="@font/my_font"
            android:textAppearance="@style/TextAppearance.AppCompat.Small"
            android:textColor="@color/colorPrimary"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@android:id/title"
            android:paddingTop="4dp"/>
    </android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>

If you intend to also modify the font of the dialog that inflates with these preferences, you will have to create a custom EditTextPreference and work with the associated dialog builder. Hope it helps you!

EDIT

If you are comfortable using styles.xml, EditTextPreferences ultimately inherit from AlertDialogs in creating and displaying their dialogs. Thus, you can create a custom theme for AlertDialogs in which you set the fontFamily. Thus:

<style name="AlertDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
        <item name="android:fontFamily">@font/my_font</item>
        <item 
name="android:textAppearance">@style/TextAppearance.AppCompat.Medium</item>
        <item name="android:textStyle">bold</item>
        <item name="android:windowNoTitle">true</item>
    </style>

Lastly, override the standard AlertDialogTheme in your application's theme using that custom AlertDialogTheme.

于 2018-08-30T22:19:44.787 回答