如何设置android Spinner项目的文本大小?

时间:2016-11-09 08:11:21

标签: c# android xamarin

我是Android开发的新手。

我的情况似乎与谷歌上发现的100万个问题(与微调器有关)有所不同,主要解决方案只是为微调器项目创建自定义xml。

在我的申请中,我需要微调项目'根据设备物理尺寸确定大小的文本,例如它应占屏幕高度/宽度的固定百分比,这意味着Px和Dp尺寸都不能帮助我。我应该注意,开发是在API 15 上执行的。

Spinner mySpinner = FindViewById<Spinner>(Resource.Id.mySpinner);
List<string> languages = new List<string>();
Translation.LoadAvailableLanguages(out languages);
var adapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleSpinnerItem, languages);
adapter.SetDropDownViewResource(Resource.Layout.spinner_item);
mySpinner.Adapter = adapter;

如您所见,我使用默认的微调器项布局作为选择显示,并使用自定义spinner_item作为下拉列表。自定义布局只是TextView

我以编程方式计算应用程序启动时布局组件的确切像素值,因此无论平板电脑/手机的dpi,分辨率和物理尺寸如何,此应用程序看起来都是一样的。

问题在于微调器。我似乎无法弄清楚,如何更改选择文本和下拉列表的文本大小。

我在适配器对象中找到了一个函数:

adapter.GetDropDownView(int position, View convertView, ViewGroup parent);

文档说:

  

获取一个视图,该视图在下拉列表中显示数据集中指定位置的数据。

     

位置 int:我们想要的视图的项目的索引。

     

convertView 查看:   如果可能的话,重用旧视图。注意:你应该检查一下   在使用之前,view是非null且具有适当的类型。如果不是   可以转换此视图以显示正确的数据,此方法   可以创建一个新视图。

     

parent ViewGroup:此视图的父级   最终会被附加到

position对我来说很清楚 convertView是一个谜。我从哪里得到这个古老的观点?这个观点究竟是什么?我该怎么用于这个参数?
parent对我来说再次不清楚了。它是什么?我认为下拉列表的父级是Spinner。在最坏的情况下,父母也可能是一项活动,但他们都不属于ViewGroup,所以我不明白这里实际需要什么?

EDIT1

我也试过这个:

(mySpinner.GetChildAt(n) as TextView).SetTextSize(Android.Util.ComplexUnitType.Px, 100);

但事实证明,mySpinner.ChildCount 0 ,而adapter.Count中有 3 项。

EDIT2 解决方案
根据接受的答案,我已将Java for Android代码转换为C#/ Xamarin for android

class SpinnerStringAdapter: Android.Widget.ArrayAdapter {
    /// <summary>
    /// Array items' text height in screen pixels
    /// </summary>
    private int ActualTextSize = 20;
    /// <summary>
    /// Display items as bold text
    /// </summary>
    private bool IsBold = false;
    /// <summary>
    /// Creates array adapter with custom sized text.
    /// </summary>
    /// <param name="AContext">The current context.</param>
    /// <param name="ALayoutID">The resource ID for a layout file containing a TextView to use when instantiating views.</param>
    /// <param name="AStringList">The string objects to represent in the ListView.</param>
    /// <param name="ADisplay">The display of the parent activity</param>
    /// <param name="ATextSize">The size of a text for the array items. Size in percents of Display height</param>
    public SpinnerStringAdapter(Context AContext, int ALayoutID, System.Collections.IList AStringList, Display ADisplay, double ATextSize, bool AIsBold):
    base(AContext, ALayoutID, AStringList) {            
        Android.Graphics.Point size = new Android.Graphics.Point();
        ADisplay.GetSize(size);
        int width = size.X;
        int height = size.Y;
        ActualTextSize = Convert.ToInt32(height * ATextSize / 100); // Convert percent to fraction and calculate actual height
        IsBold = AIsBold;
    }

    public override View GetDropDownView(int position, View convertView, ViewGroup parent) {                  
        TextView tv = (LayoutInflater.From(Context).Inflate(Resource.Layout.spinner_item, parent, false) as TextView);
        tv.SetTextSize(Android.Util.ComplexUnitType.Px, ActualTextSize);
        tv.SetText(GetItem(position).ToString(), TextView.BufferType.Normal);
        if ( IsBold ) {
            tv.SetTypeface(null, Android.Graphics.TypefaceStyle.Bold);
        }
        return tv;
    }

    public override View GetView(int position, View convertView, ViewGroup parent) {
        TextView tv = ( LayoutInflater.From(Context).Inflate(Resource.Layout.spinner_item, parent, false) as TextView );
        tv.SetTextSize(Android.Util.ComplexUnitType.Px, ActualTextSize);
        tv.SetText(GetItem(position).ToString(), TextView.BufferType.Normal);
        if ( IsBold ) {
            tv.SetTypeface(null, Android.Graphics.TypefaceStyle.Bold);
        }
        return tv;
    }
}

1 个答案:

答案 0 :(得分:0)

首先,您可以创建一个扩展ArrayAdapter的自定义Adapter类。这样,你可以在里面覆盖'getDropDownView'来改变下拉弹出窗口的显示(注意你需要定义'customspinneritem.xml',在这种情况下只需要一个TextView ej textview1)

@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
    View v = getLayoutInflater().inflate(R.layout.customspinneritem, parent, false);
    TextView tv = (TextView) v.findViewById(R.id.textview1);
    tv.setTextSize(**whatever**);
    tv.setText(languages[position]);
    return v;
}

如果要在单击之前更改微调器的显示,则要覆盖的一个函数是'getView(int position,View convertView,ViewGroup parent)'