文档章节

自定义PopupWindow实现Spinner

ldfowjemr
 ldfowjemr
发布于 2016/02/03 14:07
字数 616
阅读 163
收藏 0

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);

到此结束,一个PopupWindow似得spinner就制作完成了, 上传一下我用到的箭头资源:

本文转载自:http://m.blog.csdn.net/article/details?id=50482062

ldfowjemr
粉丝 8
博文 43
码字总数 10600
作品 0
海淀
私信 提问
PopupWindow 使用详解(一) 中文API 文档 赠送 ListPopupWindow 中文 API

笔者数了数枕巾脱落的头发,发现了 Android 开发常用的类似于弹窗的悬浮窗口 大概是 PopupWindow 和 dialog。之前有还算具体的写过关于 dialog 以及自定义 dialog 甚至是 dialogActivity 的相...

猴亮屏
01/08
0
0
Android技能树 — PopupWindow小结

前言: 关于下拉选择框,估计大家都有很多选择,我在以前的文章:项目需求讨论-HyBrid模式需求改造 上写过下拉框选择这一块,正好用的Spinner。 这次正好又有一个下拉框的需求,所以这次我使用...

青蛙要fly
2018/09/09
0
0
Android:PopupWindow

一、概述 1、构造方法 部分常用: PopupWindow(View contentView, int width, int height)Create a new non focusable popup window which can display the contentView.PopupWindow(View c......

Xushao
2013/12/16
0
2
亲,还在为PopupWindow烦恼吗

亲,还在为PopupWindow烦恼吗 ps:预览图放到了文章最后 本文已经授权鸿洋公众号转载 这篇文章其实想写很久了,然而一直以来总觉得BasePopup达不到自己的期望,所以也没有怎么去传播推荐,也...

羽翼君
2018/12/19
0
0
PopupWindow 实现自定义弹出层

Android系统的AlertDailog ,Menu。。。之类控件,我不确定能否自定义样式。 就是在应用中自定义一套主题。 因为系统Menu菜单极其单一。样式丑陋,而且字体,字号都无法修改。 想到用PopupWi...

鉴客
2012/01/13
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
4
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
3
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
13
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler modelGoon https://www.cnblogs.com/aademeng/articles/6890266.html......

大头鬼_yc
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部