Как получить имя шрифта, примененного к текстовому окну

Textview label = (TextView) findViewById(R.id.item_title);
label.setText("Solve My Issue !");
Log.d("TAG","Font-Family : "+ String.valueOf(label.getTypeface()));

Когда я вижу журнал, он возвращает Font-Family : android.graphics.Typeface@7f37f870

Как узнать название семейства шрифтов? Является ли это возможным ?


person Minion Dave    schedule 08.06.2016    source источник
comment
Метод getTypeface () возвращает объект класса Typeface, проверьте это и используйте методы из него для доступа к attr из гарнитуры   -  person ρяσѕρєя K    schedule 08.06.2016
comment
я думаю, вы пропустили ссылку, пожалуйста, поделитесь ею   -  person Minion Dave    schedule 08.06.2016
comment
возможно ли, чтобы я получил точное название шрифта   -  person Minion Dave    schedule 08.06.2016


Ответы (1)


getTypeface() метод возвращает Typeface label, в то время как этот экземпляр Tyepface представляет собой значение Map<String, Typeface> sSystemFontMap, которое является статическим полем Typeface. Итак, теперь вы получили значение, и с помощью отражения вы можете получить карту sSystemFontMap, а затем захотите найти ключ, который является в точности именем шрифта.

protected Map<String, Typeface> getSSystemFontMap() {
    Map<String, Typeface> sSystemFontMap = null;
    try {
        //Typeface typeface = Typeface.class.newInstance();
        Typeface typeface = Typeface.create(Typeface.DEFAULT, Typeface.NORMAL);
        Field f = Typeface.class.getDeclaredField("sSystemFontMap");
        f.setAccessible(true);
        sSystemFontMap = (Map<String, Typeface>) f.get(typeface);
        for (Map.Entry<String, Typeface> entry : sSystemFontMap.entrySet()) {
            Log.d("FontMap", entry.getKey() + " ---> " + entry.getValue() + "\n");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return sSystemFontMap;
}

private static List<String> getKeyWithValue(Map map, Typeface value) {
    Set set = map.entrySet();
    List<String> arr = new ArrayList<>();
    for (Object obj : set) {
        Map.Entry entry = (Map.Entry) obj;
        if (entry.getValue().equals(value)) {
            String str = (String) entry.getKey();
            arr.add(str);
        }
    }
    return arr;
}

Я протестировал его, и список arr содержит строку ниже

sans-serif
tahoma
arial
helvetica
verdana

Это не странно, потому что система Android использует тот же шрифт, что и пять названий выше. (Возможно, некоторые различия в разных версиях системы, для получения дополнительной информации перейдите к /system/etc/fonts.xml)

<family name="sans-serif">
    <font weight="100" style="normal">Roboto-Thin.ttf</font>
    <font weight="100" style="italic">Roboto-ThinItalic.ttf</font>
    <font weight="300" style="normal">Roboto-Light.ttf</font>
    <font weight="300" style="italic">Roboto-LightItalic.ttf</font>
    <font weight="400" style="normal">Roboto-Regular.ttf</font>
    <font weight="400" style="italic">Roboto-Italic.ttf</font>
    <font weight="500" style="normal">Roboto-Medium.ttf</font>
    <font weight="500" style="italic">Roboto-MediumItalic.ttf</font>
    <font weight="900" style="normal">Roboto-Black.ttf</font>
    <font weight="900" style="italic">Roboto-BlackItalic.ttf</font>
    <font weight="700" style="normal">Roboto-Bold.ttf</font>
    <font weight="700" style="italic">Roboto-BoldItalic.ttf</font>
</family>
<!-- Note that aliases must come after the fonts they reference. -->
<alias name="sans-serif-thin" to="sans-serif" weight="100" />
<alias name="sans-serif-light" to="sans-serif" weight="300" />
<alias name="sans-serif-medium" to="sans-serif" weight="500" />
<alias name="sans-serif-black" to="sans-serif" weight="900" />
<alias name="arial" to="sans-serif" />
<alias name="helvetica" to="sans-serif" />
<alias name="tahoma" to="sans-serif" />
<alias name="verdana" to="sans-serif" />

из этого вы можете видеть. sans-serif,tahoma,arial,helvetica,verdana то же самое. разные названия семейства шрифтов sans-serif

person liao    schedule 11.06.2016
comment
он возвращает мне sans-serif, tahoma, arial, helvetica, verdana, так что именно это означает? - person Minion Dave; 12.06.2016
comment
В /system/etc/fonts.xml в системе Android эти пять имен относятся к шрифту «Roboto». Итак, подведем итог: шрифт Roboto - person liao; 12.06.2016
comment
Есть ли более простой способ сделать это? Как я вижу в официальной документации для Typeface, к сожалению, нет свойства или метода под названием Typeface.NAME или Typeface.getName () - person Ashok Bijoy Debnath; 16.09.2019
comment
Спасибо! Это работает хорошо, но есть предупреждение. Есть ли способ исправить это предупреждение? 1. Не удается разрешить поле sSystemFontMap в Typeface.class.getDeclaredField (sSystemFontMap); 2. Непроверенное приведение: 'java.lang.Object' в 'java.util.Map ‹java.lang.String, android.graphics.Typeface›' в (Map ‹String, Typeface›) f.get (font); - person Fisher; 31.01.2021