Xamarin Android中设置Spinner内容可滚动及宽高限制的方法
解决Xamarin Android Spinner下拉框限制显示3-4个条目问题
嘿,我刚好之前碰到过这个需求!默认的Spinner下拉框会根据屏幕空间显示尽可能多的条目,要限制它最多显示3-4个,剩下的滚动查看,得稍微动手改一下,下面给你两种靠谱的方案:
方案一:用反射快速设置下拉高度(简单直接)
这种方法不用自定义控件,适合快速实现:
- 先给下拉条目固定高度(方便计算总高度)
创建一个下拉条目的布局文件item_spinner_dropdown.xml:
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="48dp" <!-- 固定每个条目的高度 --> android:paddingStart="16dp" android:paddingEnd="16dp" android:gravity="center_vertical" android:textColor="@android:color/black" />
- 设置Spinner的适配器
在代码里给Spinner绑定适配器,指定下拉视图用上面的布局:
var itemList = new List<string> { "条目1", "条目2", "条目3", "条目4", "条目5", "条目6", "条目7", "条目8", "条目9", "条目10" }; var adapter = new ArrayAdapter<string>(this, Resource.Layout.item_spinner_dropdown, itemList); adapter.SetDropDownViewResource(Resource.Layout.item_spinner_dropdown); yourSpinner.Adapter = adapter;
- 反射设置下拉弹窗高度
在Spinner加载完成后,通过反射获取它的下拉弹窗,设置最大高度为4个条目高度之和:
yourSpinner.Post(() => { try { // 获取Spinner内部的PopupWindow实例 var popupField = typeof(Spinner).GetField("mPopup", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); var listPopup = popupField.GetValue(yourSpinner) as Android.Widget.ListPopupWindow; // 把dp转换成像素,计算4个条目的总高度 int singleItemHeight = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, 48, Resources.DisplayMetrics); listPopup.Height = singleItemHeight * 4; // 这里设置最多显示4个条目 } catch (Exception ex) { Console.WriteLine($"设置下拉高度出错:{ex.Message}"); } });
方案二:自定义Spinner控件(更稳定,适合长期维护)
如果担心反射在不同Android版本出问题,可以自定义一个Spinner控件,重写弹窗创建的逻辑:
- 自定义LimitedHeightSpinner类
using Android.Content; using Android.Util; using Android.Widget; namespace YourAppNamespace { public class LimitedHeightSpinner : Spinner { private int _maxDropDownItems = 4; // 默认最多显示4个 public LimitedHeightSpinner(Context context) : base(context) { } public LimitedHeightSpinner(Context context, IAttributeSet attrs) : base(context, attrs) { } public LimitedHeightSpinner(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr) { } // 对外暴露设置最大显示条数的属性 public int MaxDropDownItems { get => _maxDropDownItems; set => _maxDropDownItems = value; } protected override void OnCreatePopupWindow() { base.OnCreatePopupWindow(); if (PopupWindow != null) { // 测量单个下拉条目的高度 var tempView = GetDropDownView(0, null, null); tempView.Measure(MeasureSpec.MakeMeasureSpec(0, MeasureSpecMode.Unspecified), MeasureSpec.MakeMeasureSpec(0, MeasureSpecMode.Unspecified)); int singleItemHeight = tempView.MeasuredHeight; // 设置弹窗最大高度 PopupWindow.Height = singleItemHeight * _maxDropDownItems; } } } }
- 在布局文件中使用自定义Spinner
<YourAppNamespace.LimitedHeightSpinner android:id="@+id/limitedSpinner" android:layout_width="match_parent" android:layout_height="wrap_content" />
- 在代码中配置使用
var limitedSpinner = FindViewById<LimitedHeightSpinner>(Resource.Id.limitedSpinner); limitedSpinner.MaxDropDownItems = 4; // 设置最多显示4个条目 var itemList = new List<string> { "条目1", "条目2", "...", "条目10" }; var adapter = new ArrayAdapter<string>(this, Resource.Layout.item_spinner_dropdown, itemList); adapter.SetDropDownViewResource(Resource.Layout.item_spinner_dropdown); limitedSpinner.Adapter = adapter;
这两种方案都能实现你的需求:当下拉条目超过4个时,只显示4个,剩下的可以滚动查看;如果条目不足4个,会自适应高度,不会留空。
内容的提问来源于stack exchange,提问作者xam
相关产品推荐
相关产品推荐

