Android中的spinner控件点击之后是以弹出dialog 的形式供我们选择,但我们其实更希望可以看到是下拉菜单的感觉,如下图所示:
要实现这种效果其实也不难,自定义一个popupwindow控件就可以解决问题
在显示popupwindow时右侧箭头朝下,在popupwindow消失时右侧箭头朝右
先来看一下我自定义的popupwindow
SpPopWindow.java
public class SpPopWindow extends PopupWindow implements OnClickListener{ private Context mContext; private TextView mThreeTv; private TextView mTenTv; private TextView mThirtyTv; private OnClickListener mListener; private OnDismissListener mDismissListener; public SpPopWindow(Context mContext,OnClickListener mListener,OnDismissListener mDismissListener) { super(); this.mContext = mContext; this.mListener = mListener; this.mDismissListener = mDismissListener; initView(); } @SuppressLint("NewApi") private void initView() { View view = LayoutInflater.from(mContext).inflate(R.layout.list_item_sp_pop,null); setContentView(view); setFocusable(true); setTouchable(true); setOutsideTouchable(true); update(); setBackgroundDrawable(new ColorDrawable(Color.BLACK)); mThreeTv = (TextView) view.findViewById(R.id.item_three_tv); mTenTv = (TextView) view.findViewById(R.id.item_ten_tv); mThirtyTv = (TextView) view.findViewById(R.id.item_thirty_tv); setViewOnClick(mThreeTv,mTenTv,mThirtyTv); //当popupwindow消失时调用该方法 setOnDismissListener(mDismissListener); } /** * 为控件设置点击 * @param views */ private void setViewOnClick(View... views){ if (views != null) { for (View view : views) { view.setOnClickListener(this); } } } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.item_three_tv: case R.id.item_ten_tv: case R.id.item_thirty_tv: mListener.onClick(v); dismiss(); break; default: dismiss(); break; } } public void showSpPop(View parent) { if(!this.isShowing()){ //所显示的与parent的宽度相等 setWidth(parent.getWidth()); setHeight(LayoutParams.WRAP_CONTENT); this.showAsDropDown(parent, 0, 0); }else { dismiss(); } } @Override public boolean isShowing() { return super.isShowing(); } }
所用的layout文件为:
list_item_sp_pop.xml,在这里我只有三个选项,所以没有使用listview布局,如果选项很多,可以使用listview布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@drawable/selector_start_pump" android:gravity="center"> <TextView android:id="@+id/item_three_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/delay_three" android:textSize="15dp" android:textColor="@color/black" android:padding="10dp"/> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/gray3"/> <TextView android:id="@+id/item_ten_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/delay_ten" android:textSize="15dp" android:textColor="@color/black" android:padding="10dp"/> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/gray3"/> <TextView android:id="@+id/item_thirty_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/delay_thirty" android:textSize="15dp" android:textColor="@color/black" android:padding="10dp"/> </LinearLayout>
在activity中使用:
//声明popupwindow private SpPopWindow mStartPopWindow ; /** * 延时启动右侧图标的变化控制 */ private OnDismissListener mStartDismissListener = new OnDismissListener() { @Override public void onDismiss() { mStartPumpDelay.setCompoundDrawables(null, null, drawableRight, null); } };
//延时启动popupwindow mStartPopWindow = new SpPopWindow(getApplicationContext(), mStartDelayListener,mStartDismissListener);
然后在点击控件时的动作如下:
//显示出popupwindow mStartPopWindow.showSpPop(mStartPumpDelay); //改变右侧图标 mStartPumpDelay.setCompoundDrawables(null, null, drawableDown, null);
其中对程序中所用图标的处理:
//初始化延时启动右侧图标 drawableDown = getResources().getDrawable(R.drawable.arrow_down); drawableRight = getResources().getDrawable(R.drawable.arrow_right); //这一步必须要做,否则不会显示 drawableDown.setBounds(0,0,30,30); drawableRight.setBounds(0,0,30,30);