自定义下拉列表(Spinner)

            对于下拉列表的使用,android提供了原生的spinner组件来实现。But,原生的spinner组件的样式太简陋,而我们的UI是不会给我们设计那么简陋的下拉列表样式的。所以,你没办法,只能自定义一个。

      要说自定义那种悬浮样式的下拉列表,相信很多人脑海中能瞬间浮现两种可能的实现方式,一是dialog,二是popupwindow。两种方式都可以实现,看你喜欢。这两个弹窗在表现上有点区别。区别1dialog没办法将宽设为屏幕宽度,总会有一点边界,怎么处理都不行的(亲测如此),而popupwindow则可以将宽度设为屏幕宽度。区别2popupwindow不会给页面其他部分添加蒙层,而dialog会。区别3popupwindow没有标题,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) {
           }
});


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值