更改 Android EditTextPreference 的 fontFamily
Change fontFamily for Android EditTextPreference
我正在尝试更改 EditTextPreference fontFamily,以便所有可见文本(包括首选项标题和对话框标题)都使用自定义字体资源显示。有什么建议么?我尝试在 styles.xml 中建立 fontFamily 以及创建自定义 EditTextPreference。谢谢!
作为参考,我附上了当前视图(注意工具栏标题和首选项小部件之间的字体差异):
Settings page
此代码可以为您服务:
在 activity 中这样调用:
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);
}
}
}
}
此方法将所有字体更改为在视图组中查看
谢天谢地,我找到了问题的答案。该解决方案涉及创建自定义布局并在我的 preferences.xml 文件中引用它。它是这样分解的:
preferences.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>
preference_layout.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>
如果您还打算修改使用这些首选项扩充的对话框的字体,则必须创建自定义 EditTextPreference 并使用关联的对话框构建器。希望对你有帮助!
编辑
如果您习惯使用 styles.xml,EditTextPreferences 最终会继承 AlertDialogs 来创建和显示其对话框。因此,您可以为设置 fontFamily 的 AlertDialogs 创建自定义主题。因此:
<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>
最后,使用自定义 AlertDialogTheme 覆盖应用程序主题中的标准 AlertDialogTheme。
我正在尝试更改 EditTextPreference fontFamily,以便所有可见文本(包括首选项标题和对话框标题)都使用自定义字体资源显示。有什么建议么?我尝试在 styles.xml 中建立 fontFamily 以及创建自定义 EditTextPreference。谢谢!
作为参考,我附上了当前视图(注意工具栏标题和首选项小部件之间的字体差异): Settings page
此代码可以为您服务:
在 activity 中这样调用:
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);
}
}
}
}
此方法将所有字体更改为在视图组中查看
谢天谢地,我找到了问题的答案。该解决方案涉及创建自定义布局并在我的 preferences.xml 文件中引用它。它是这样分解的:
preferences.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>
preference_layout.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>
如果您还打算修改使用这些首选项扩充的对话框的字体,则必须创建自定义 EditTextPreference 并使用关联的对话框构建器。希望对你有帮助!
编辑
如果您习惯使用 styles.xml,EditTextPreferences 最终会继承 AlertDialogs 来创建和显示其对话框。因此,您可以为设置 fontFamily 的 AlertDialogs 创建自定义主题。因此:
<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>
最后,使用自定义 AlertDialogTheme 覆盖应用程序主题中的标准 AlertDialogTheme。