我是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;
}
}
答案 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)'