自定义字体未加载到对话框的 listView 中

Posted

技术标签:

【中文标题】自定义字体未加载到对话框的 listView 中【英文标题】:custom font are not loaded in dialog's listView 【发布时间】:2019-06-05 06:37:01 【问题描述】:

我已经在drawable文件夹下定义了字体文件夹和xml文件。我正在使用对话并定义了List_view.xmlList_item.xml 以显示对话;然而,list_item.xml 中定义的自定义字体在对话框出现时没有加载;显示默认的 android 字体。

我已尝试更改整个应用的默认字体,但对话仍会加载默认字体。

default-font-in-dialoguei want to use this font in dialog



public void showDialogListView(View view) 


        dialog = new Dialog(personal_info_1.this);
        dialog.setContentView(R.layout.list_view);
        dialog.setTitle("Select Country");
        dialog.setCancelable(true);
        dialog.setCanceledOnTouchOutside(true);

        //prepare a list view in dialog
        listview_country = dialog.findViewById(R.id.dialogList);


        ArrayAdapter adapter = new ArrayAdapter(getApplicationContext(), R.layout.list_item, R.id.txtitem, country_name);
        listview_country.setAdapter(adapter);
        listview_country.setOnItemClickListener(new AdapterView.OnItemClickListener() 
            @Override
            public void onItemClick(AdapterView parent, View view, int position, long id) 
                //Toast.makeText(personal_info_1.this, "Clicked Item: " + parent.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show();
                textview_country_info.setText(parent.getItemAtPosition(position).toString());
                dialog.dismiss();
            
        );


        dialog.show();
    

这里,数组适配器中的country_name数组是从onCreate中的数据库方法中获取的。

list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_
android:layout_
android:orientation="vertical">

<TextView
    android:id="@+id/txtitem"
    android:layout_
    android:layout_
    android:fontFamily="@font/quicksand_light"
    android:padding="10dp"
    android:text="Text"
    android:textSize="16sp" />

<View
    android:layout_
    android:layout_
    android:layout_marginLeft="15dp"
    android:layout_marginRight="15dp"
    android:background="@color/line_light"
/>

list_view.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical">

    <ListView
        android:id="@+id/dialogList"
        android:layout_
        android:layout_
        android:background="@drawable/listview_background"></ListView>

</LinearLayout>

【问题讨论】:

【参考方案1】:

我在这里发布的最简单的方法之一,请看一下。

您只需在“list_item.xml 文件”的 textview 中删除“android:fontfamily”元素 然后执行以下操作。

1.在res/font/中创建一个字体文件夹然后 2.您只需在 res/values/style.xml 中提及如下-(只需将字体系列项添加到资源中)

<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="android:fontFamily">@font/ubuntu_regular</item>
    <item name="fontFamily">@font/ubuntu_regular</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="android:fontFamily">@font/ubuntu_regular</item>
    <item name="fontFamily">@font/ubuntu_regular</item>
</style>

3.然后您只需运行代码,这种基于 style.xml 的字体将自动应用于整个应用程序。您无需在应用程序的任何位置添加字体系列。

【讨论】:

你添加你的字体文件而不是“font/ubuntu_regular”,比如“@font/ 我已经按照你说的尝试了,但是没有用。还是一样的问题。 @Rajaji Subramanian 您是否从“list_item.xml”中删除了这一行“android:fontFamily="@font/quicksand_light"? 请仔细检查一次,因为这是我发布的 100% 有效的解决方案。 如果您按照我发布的方式进行操作,则无需在应用程序的任何位置提供字体。即使是自定义字体字体也会更改默认警报对话框文本中的字体【参考方案2】:

您可以创建扩展 TextView 的 CustomTextView 类,并在您的 .xml 文件中使用该 CustomTextView 类,而不是简单的

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Typeface;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.widget.TextView;


@SuppressLint("AppCompatCustomView")
public class CustomTextView extends TextView 


    protected void onDraw(Canvas canvas) 
        super.onDraw(canvas);

    
    public CustomTextView(Context context) 
        super(context);
        if (!isInEditMode()) 
            Typeface face = Typeface.createFromAsset(context.getAssets(),
                    "fonts/OpenSansSemiBold.ttf");
            this.setTypeface(face);
        
    

    public CustomTextView(Context context, AttributeSet attrs) 
        super(context, attrs);
        if (!isInEditMode()) 
            Typeface face = Typeface.createFromAsset(context.getAssets(),
                    "fonts/OpenSansSemiBold.ttf");
            this.setTypeface(face);
        
    

    public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) 
        super(context, attrs, defStyleAttr);
        if (!isInEditMode()) 
            Typeface face = Typeface.createFromAsset(context.getAssets(),
                    "fonts/OpenSansSemiBold.ttf");
            this.setTypeface(face);
        
    

在您的 .xml 中:

<app.com.packagename.CustomTextView
android:layout_
android:layout_            
android:text="text"/>

【讨论】:

不客气。如果你能接受这个答案会很高兴。

以上是关于自定义字体未加载到对话框的 listView 中的主要内容,如果未能解决你的问题,请参考以下文章

Qml FontLoader 未加载自定义字体

加载资源失败:404(未找到)- Rails 自定义字体

UITableViewRowAction 在 Swift 中自定义标题字体大小

如何在 zsh 中自定义命令未找到的样式

可以在 IB 的导航栏中自定义提示字符串的字体吗?

在自定义对话框中自定义 Wix 安装程序中的图像