如何更改微调框的字体家族?

时间:2019-03-21 10:13:14

标签: android android-layout spinner

我使用android studio创建一个android应用。我的API版本高于16,并且使用支持库26。 我在res-> font下面创建了一个字体家族,并将其命名为“ cairo_regular.ttf”。 在我的android应用中,在我的界面之一中,我使用具有下拉样式的Spinner来显示所有国家/地区的列表,以下是xml代码:

<android.support.v7.widget.AppCompatSpinner
            android:id="@+id/spinner"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_marginTop="10dp"
            android:layout_marginRight="16dp"
            android:prompt="@string/spinner_title" />

我在类java中的构造函数外部声明了适配器,即:

final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, countryTab);
            country.setAdapter(arrayAdapter);

我还在布局文件夹中制作了以下自定义xml文件:

<android.support.v7.widget.AppCompatTextView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/text1"
    style="?android:attr/dropDownItemStyle"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:ellipsize="marquee"
    android:singleLine="true"
    android:fontFamily="@font/cairo_regular"
    android:textAppearance="?android:attr/textAppearanceLargePopupMenu" />

我添加了自定义xml文件“ android:fontFamily =“ @ font / cairo_regular”“,以更改微调器中的国家/地区列表的字体,但该字体没有更改。 我想知道如何在我的应用程序中更改Spinner的字体。

2 个答案:

答案 0 :(得分:3)

因此,让我们尝试了解在尝试填充Spinner时编写此代码行会发生什么情况。

[ArrayAdapter<String> spinnerAdapter= new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, dataInsideSpinner); // here dataInsideSpinner is a List<>
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);]

android.R.layout.simple_list_item_1是Spinner's Item的布局,或者是未选中时的布局(通常在屏幕上如何显示) android.R.layout.simple_dropdown_list是在您选择微调器并显示 Dropdown Items

时呈现的布局

因此,您可以通过两种方式自定义微调框。 通过修改android.R.layout.simple_list_item_1android.R.layout.simple_dropdown_list来更改布局文件 或者通过更改您的Java文件!如下面的一些答案所述。但是这种方法似乎更容易,更轻松!

每次尝试使用这两个文件时,微调器将显示更改(在这些文件中所做的更改)。

否则,首选的方法是编写2个自定义布局文件 1> custom_spinner_list_item 2> Custom_spinner_dropdown_item(单击渲染红色)

这是完成方式的摘要。 custom_spinner_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text1"
    style="?attr/spinnerDropDownItemStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:fontFamily="@font/roman"
    android:singleLine="true"
    android:textAlignment="inherit"
    android:textColor="@color/black90opacity"
    android:textSize="14sp">

</TextView>

custom_spinner_dropdown_item.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text1"
    style="?attr/spinnerDropDownItemStyle"
    android:layout_width="match_parent"
    android:layout_height="?attr/dropdownListPreferredItemHeight"
    android:ellipsize="marquee"
    android:fontFamily="@font/roman"
    android:singleLine="true"
    android:textAlignment="textStart"
    android:textColor="@color/black90opacity"
    android:textSize="14sp">

</TextView>

现在在将数据插入适配器的位置使用这些文件

 ArrayAdapter<String> spinnerAdapter= new ArrayAdapter<>(getApplicationContext(), R.layout.custom_spinner_list_item.xml, dataInsideSpinner); // here dataInsideSpinner is a List<>
    spinnerAdapter.setDropDownViewResource(R.layout.custom_spinner_dropdown_item.xml);

应该很好! :)

答案 1 :(得分:0)

这是我的操作方式:

FontCache类:

import android.content.Context;
import android.graphics.Typeface;
import java.util.HashMap;


public class FontCache {

private static HashMap<String, Typeface> fontCache = new HashMap<>();

public static Typeface getTypeface(String fontname, Context context) {
    Typeface typeface = fontCache.get(fontname);

    if (typeface == null) {
        try {
            typeface = Typeface.createFromAsset(context.getAssets(), fontname);
        } catch (Exception e) {
            return null;
        }

        fontCache.put(fontname, typeface);
    }

    return typeface;
}
}

然后创建一个扩展TextView的自定义类:

public class MontserratRegularTextView extends android.support.v7.widget.AppCompatTextView {

public MontserratRegularTextView(Context context) {
    super(context);

    applyCustomFont(context);
}

public MontserratRegularTextView(Context context, AttributeSet attrs) {
    super(context, attrs);

    applyCustomFont(context);
}

public MontserratRegularTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    applyCustomFont(context);
}

private void applyCustomFont(Context context) {
    Typeface customFont = FontCache.getTypeface("fonts/Montserrat-Regular.otf", context);//your font path here
    setTypeface(customFont);
}
}

然后将其添加到正在创建的自定义xml文件中:

<com.example.myapplication.customFonts.MontserratRegularTextView
    android:id="@+id/user_email"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="@dimen/nav_header_vertical_spacing"
    android:text="@string/nav_header_title"
     />

希望这对您有帮助!