Запретить пользовательские системные шрифты переопределять шрифты приложения - PullRequest
0 голосов
/ 02 октября 2019

Устройства типа Samsung позволяют пользователям устанавливать custom system fonts. Проблема в том, что эти шрифты могут переопределять мое приложение fonts. Я имею в виду, если я установлю Arial font в своем приложении и установлю Calibri шрифт как system font на своем мобильном телефоне, то Arial будет переопределено Calibri font.

Какчтобы предотвратить эту ситуацию?

1 Ответ

2 голосов
/ 02 октября 2019
  • "Если вам нужно установить один шрифт для всех TextView's в вашем Android приложении, вы можете использовать это решение.
  • Это переопределит ВСЕ TextView's гарнитуры, включая Action Bar, пользовательские системные шрифты и другие стандартные компоненты, но EditText's шрифт пароля не будет переопределен. "(По понятным причинам).

  • Использование reflection для переопределения гарнитуры по умолчанию и класса Application.

  • ПРИМЕЧАНИЕ: НЕ ЗАБУДЬТЕ УСТАНОВИТЬ TYPEFACE ДЛЯ ТЕМЫ APP В КАЧЕСТВЕ ТИПА ПО УМОЛЧАНИЮ, КОТОРЫЙ БУДЕТ ПЕРЕГРУЗЕН *

MyApp.java :

public class MyApp extends Application {

  @Override
  public void onCreate() {
    TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/Roboto-Regular.ttf"); // font from assets: "assets/fonts/Roboto-Regular.ttf
  }
}

res / themes.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <style name="MyAppTheme" parent="@android:style/Theme.Holo.Light">
    <!-- you should set typeface which you want to override with TypefaceUtil -->
    <item name="android:typeface">serif</item>
  </style>
</resources>

TypefaceUtil.java :

import android.content.Context;
import android.graphics.Typeface;
import android.util.Log;

import java.lang.reflect.Field;

public class TypefaceUtil {

    /**
     * Using reflection to override default typeface
     * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE OVERRIDDEN
     * @param context to work with assets
     * @param defaultFontNameToOverride for example "monospace"
     * @param customFontFileNameInAssets file name of the font from assets
     */
    public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {
        try {
            final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);

            final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
            defaultFontTypefaceField.setAccessible(true);
            defaultFontTypefaceField.set(null, customFontTypeface);
        } catch (Exception e) {
            Log.e("Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
        }
    }
}

assets / fonts /Roboto-Regular.ttf:

Поместите сюда свой шрифт, например Arial.

ref1

Автор Артем Зиннатуллин

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...