将自定义字体设置为微调器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将自定义字体设置为微调器相关的知识,希望对你有一定的参考价值。

这已被问了很多,但它没有被要求使用xamarin。

这是我的问题:

我有自定义微调器的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/xy1z"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="14sp"
    android:paddingLeft="20dp" />

我有一个自定义微调器:

        spnMyFriends = FindViewById<Spinner>(Resource.Id.txt_myfriends_addafriend);

        String[] friends = new String[]
        {
            "My friends",
            "I am following",
        };



        ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<String>(
                this, Resource.Layout.spinner_item, friends);

        spinnerArrayAdapter.SetDropDownViewResource(Resource.Layout.spinner_item);
        spnMyFriends.Adapter = spinnerArrayAdapter;

        spnMyFriends.ItemSelected += new EventHandler
            <AdapterView.ItemSelectedEventArgs>(SpinnerItems);

现在,你会认为既然我可以编辑xml文件,我可以简单地这样做:

Textview txtv = FindViewById<TextView>(Resource.Id.xy1z);
txtv.SetTypeFace(font, TypefaceStyle.Normal);

这适用于每个单一的textview - 但它对我的微调器不起作用。最后一行,我设置字体崩溃与“...没有设置对象的实例”。什么是错误的,因为我之前在行中初始化了Textview对象......所以,

1.)为什么我的想法不起作用? 2.)如何更改字体?

帮助会很棒。

答案

为什么

Spinner是适配器模式。您在错误的位置设置字体。

这适用于每个单一的textview。

是的,您可以在Activity的布局中找到TextView并配置其字体,因为Activity需要布局来显示其内容。

Spinner也有一个布局,因为你可以看到它是一个弹出窗口,其内容需要Adapter配置,所以在Adapter你可以得到TextView并设置其字体。

怎么样

就像@elmorabea所说,你需要一个自定义的Adapter并且在GetView方法中,你需要设置Typeface,下面是一个简单的:

public class MainActivity : Activity
{
    Spinner spnMyFriends;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);
        initView();
    }

    private void initView()
    {
        spnMyFriends = FindViewById<Spinner>(Resource.Id.txt_myfriends_addafriend);

        List<string> friends = new List<string>
        {
        "My friends",
        "I am following",
        };

        MyAdapter myAdapter = new MyAdapter(this,friends);
        spnMyFriends.Adapter = myAdapter;

    }

}

public class MyAdapter : BaseAdapter<string>
{
    Context mContext;
    readonly LayoutInflater inflater;
    List<string> itemList;
    public MyAdapter(Context context, List<string> list) {
        this.inflater = LayoutInflater.FromContext(context);
        this.mContext = context;
        this.itemList = list;
    }
    public override string this[int position]
    {
        get { return itemList[position]; }
    }
    public override int Count {
        get { return itemList.Count; }
    }
    public override long GetItemId(int position)
    {
        return position;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView ?? inflater.Inflate(Resource.Layout.spinner_item, parent, false);

        var item = itemList[position];

        TextView tv = view.FindViewById<TextView>(Resource.Id.xy1z);
        // here to set your Typeface
        Typeface typeFace1 = Typeface.CreateFromAsset(mContext.Assets, "fonts/NotoSansCJK-Black.ttc");
        tv.SetTypeface(typeFace1, TypefaceStyle.Normal);
        tv.Text = itemList[position];
        return view;
    }
}
另一答案

你的问题就在于你在哪里发挥自己的观点。

你在你的find上调用findViewById(),它没有activitydropDown视图。

spinner创建一个弹出窗口并在其上显示列表,这不是您的活动视图的一部分,它有点漂浮在它上面。

你需要的是一个自定义的Spinners,你可以覆盖Adapter并返回一个正确配置的视图与一个花哨的自定义TypeFace。

以上是关于将自定义字体设置为微调器的主要内容,如果未能解决你的问题,请参考以下文章

java 将自定义字体设置为所有textview

如何将微调器的值放入不同的片段中?

如何将自定义字体设置为 android 工具栏的字幕?

Android - 如何将自定义对象传递给片段

如何将自定义字体应用于 TTTAttributedLabel

php 将自定义图标字体添加到WPBakery页面构建器