对于下拉列表的使用,android提供了原生的spinner组件来实现。But,原生的spinner组件的样式太简陋,而我们的UI是不会给我们设计那么简陋的下拉列表样式的。所以,你没办法,只能自定义一个。
要说自定义那种悬浮样式的下拉列表,相信很多人脑海中能瞬间浮现两种可能的实现方式,一是dialog,二是popupwindow。两种方式都可以实现,看你喜欢。这两个弹窗在表现上有点区别。区别1,dialog没办法将宽设为屏幕宽度,总会有一点边界,怎么处理都不行的(亲测如此),而popupwindow则可以将宽度设为屏幕宽度。区别2,popupwindow不会给页面其他部分添加蒙层,而dialog会。区别3,popupwindow没有标题,dialog默认有变体(这都不是事儿,去掉标题就好了)。
本人在此选择的实现下拉列表的方式是popupwindow。要是你的需求是下拉列表弹出后要给页面其它部分蒙层,那你得用dialog来实现,不过这种奇葩需求应该不会有。
实现起来其实很简单,和自定义dialog是一样的。首先,写一个类,如SpinnerPopupWindow继承自popupWindow,通过构造方法传必要的Context参数(以及其它你需要的参数),然后渲染布局,设置参数,处理事件,就OK了。
以下是关键实现代码:
(1)继承popupWindow,添加构造方法。
public class SpinerPopWindow extends PopupWindow {
public SpinerPopWindow(Context context) {
this.context = context;
resources = context.getResources();
inflater = LayoutInflater.from(context);
init();
}
}
(2)渲染布局,设置参数。
private void init(){
View view = inflater.inflate(R.layout.spiner_window_account_layout, null);
setContentView(view);
setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
setFocusable(true);
ColorDrawable dw = new ColorDrawable(0x00);
setBackgroundDrawable(dw);
}
setFocusable(true);是让用户点击外部区域时,销毁弹窗。
ColorDrawable dw = new ColorDrawable(0x00);
setBackgroundDrawable(dw);
是设置背景透明。
(3)事件处理,自己写个回调。
public void setOnItemClickListener(OnItemClickListener listener) { this.listener = listener; } public interface OnItemClickListener { void onClick(String content, int flag); } 假设弹窗上有个按钮bt_test,在bt_test的点击事件处理中,调用listener.onClick(参数1,参数2)即可。
(4)使用。以上是自定义SpinnerPopupWindow中的处理,在使用的时候,首先,当然要把类new出来啦。
SpinnerPopupWindow s = new SpinnerPopupWindow(this); 然后,在需要把弹窗弹出来的时候设置展示的位置,还可以设置弹窗的宽度,出场动画和退厂动画。 s.setWidth(Util.sp2px(mContext, 138f)); s.setAnimationStyle(R.style.setting_spinner_anim); s.showAsDropDown(rela_today_region_result); 由于我的控件的宽度是使用sp为单位来设置的,为了让弹窗的宽度和我的控件宽度相同,我把我的sp转化为px来为弹窗设置宽度:Util.sp2px(mContext, 138f)。 setting_spinner_anim是我的出入场动画。 rela_today_region_result是我的弹出弹窗的控件。
(5)弹窗中控件点击事件处理。已经在自定义类中写好了回调,接下里只要在activity/fragment中为弹窗设置OnItemClickListener即可进行相应的事件处理。
s.setOnItemClickListener(new SpinerPopWindow.OnItemClickListener() { @Override public void onClick(String content, int flag) { } });