Android使用popueWindow自定义Spinner
其实就是很简单的控件自定义,只不过这两天项目用到,还是到处搜改了下,现简单记录。方便有需要的时候修改为自己使用:
需求
一个TextView或者Button点击的时候要弹出一些下拉选择框,可能TextView/Button还要变色或者图标变化:
实现思路
点击Textview的时候弹出一个popupWindow(后文简写),popWind布局是一个RelativeLayout或者LinearLayout,里面一个ListView/Recyclerview,它的item自己根据需要定义。
简单代码
1,MainActivity.java 程序入口,初始化数据,初始化自定义popWind,TextView点击之后显示popWind,处理ListView的点击事件:
/** * 主Activity 用来实现popupwindow * @author ansen */
public class MainActivity extends Activity { private SpinerPopWindow<String> mSpinerPopWindow; private List<String> list; private TextView tvValue; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initData(); tvValue = (TextView) findViewById(R.id.tv_value); tvValue.setOnClickListener(clickListener); mSpinerPopWindow = new SpinerPopWindow<String>(this, list);mSpinerPopWindow.setOnItemListener(dismissListener);mSpinerPopWindow.setOnDismissListener(dismissListener); } /** * 监听popupwindow取消 */ private OnDismissListener dismissListener=new OnDismissListener() { @Override public void onDismiss() { setTextImage(R.drawable.icon_down); } }; /** * popupwindow显示的ListView的item点击事件 */ private OnItemClickListener itemClickListener = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position,long id) { mSpinerPopWindow.dismiss(); tvValue.setText(list.get(position)); Toast.makeText(MainActivity.this, "点击了:" + list.get(position),Toast.LENGTH_LONG).show(); } }; /** * 显示PopupWindow */ private OnClickListener clickListener = new OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.tv_value: mSpinerPopWindow.setWidth(tvValue.getWidth()); mSpinerPopWindow.showAsDropDown(tvValue); setTextImage(R.drawable.icon_up); break; } } }; /** * 初始化数据 */ private void initData() { list = new ArrayList<String>(); for (int i = 0; i < 5; i++) { list.add("test:" + i); } } /** * 给TextView右边设置图片 * @param resId */ private void setTextImage(int resId) { Drawable drawable = getResources().getDrawable(resId); drawable.setBounds(0, 0, drawable.getMinimumWidth(),drawable.getMinimumHeight());// 必须设置图片大小,否则不显示 tvValue.setCompoundDrawables(null, null, drawable, null); }
}
2,activity_main.xml 这个文件也没啥好说的,就是两个TextView:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:orientation="horizontal"> <TextView android:id="@+id/tv_value" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/shape_help_category_tv_bg" android:drawableRight="@drawable/icon_down" android:padding="10dp" android:textColor="@color/content_color" android:text="请选择父类别" android:textSize="20sp"/> <TextView android:layout_marginLeft="5dp" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/shape_help_category_tv_bg" android:drawableRight="@drawable/icon_down" android:textColor="@color/content_color" android:padding="10dp" android:text="请选择子类别" android:textSize="20sp" /> </LinearLayout>
</LinearLayout>
3,SpinerPopWindow.java 自定义Popupwindow类,初始化popWind显示的布局,以及一些参数,并且给listView设置适配器:
* 自定义PopupWindow 主要用来显示ListView * @author Jason* @create time 2022-3 */
public class SpinerPopWindow<T> extends PopupWindow { private LayoutInflater inflater; private ListView mListView; private List<T> list; private MyAdapter mAdapter; public SpinerPopWindow(Context context,List<T> list) { super(context); inflater=LayoutInflater.from(context); this.list=list; View view = inflater.inflate(R.layout.spiner_window_layout, null); setContentView(view);//大小怎么设置,或者不设置,根据自己需要 setWidth(LayoutParams.WRAP_CONTENT); setHeight(LayoutParams.WRAP_CONTENT); setFocusable(true); ColorDrawable dw = new ColorDrawable(0x00); setBackgroundDrawable(dw); mListView = (ListView) view.findViewById(R.id.listview);mAdapter=new MyAdapter()mListView.setAdapter(mAdapter); } private void SetOnItemListener(OnItemClickListener clickListener){ if(mListView != null){mListView.setOnItemClickListener(clickListener); }} private class MyAdapter extends BaseAdapter{ @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder=null; if(convertView==null){ holder=new ViewHolder();// 这个spiner_item_layout就是根据自己需要定义,比如仅一个textviewconvertView=inflater.inflate(R.layout.spiner_item_layout, null); holder.tvName=(TextView) convertView.findViewById(R.id.tv_name); convertView.setTag(holder); }else{ holder=(ViewHolder) convertView.getTag(); } holder.tvName.setText(getItem(position).toString()); return convertView; } } private class ViewHolder{ private TextView tvName; }
}
4,spiner_window_layout.xml,popWind显示的布局文件,里面就一个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="wrap_content" android:layout_alignParentRight="true" android:orientation="vertical"> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/shape_popupwindow_list_bg" android:scrollbars="none" > </ListView>
</LinearLayout>
各部分代码根据自身需要修改,比如listView-item,或者点击事件等。
Android使用popueWindow自定义Spinner相关推荐
- android hint格式,自定义Spinner样式以及实现hint效果
android中有个Spinner控件,也就是下拉控件.但是初始的样式比较不好看,所以想着更改下样式.这样就不需要一直用EditText+popupwindow的方式来实现这种效果,会比较这种方式更简 ...
- Android开发之自定义Spinner样式的效果实现(源代码实现)
android系统自带的Spinner样式是远远满足不了我们实际开发过程中对Spinner UI风格的要求,因此我们肯定需要为了切合整个应用的风格,修改我们的Spinner样式.系统给我们提供了两种常 ...
- android spinner自定义样式,android自定义Spinner下拉菜单(下拉列表框)样式
在Android中Spinner就是下拉菜单,它相当于HTML中的标签. Android中提供的Spinner Widget下拉菜单已经非常好用了,样式也适用, 不过我们还是可以通过定义xml的方式来 ...
- android自定义下拉筛选,android自定义Spinner下拉菜单(下拉列表框)样式
在Android中Spinner就是下拉菜单,它相当于HTML中的标签. Android中提供的Spinner Widget下拉菜单已经非常好用了,样式也适用, 不过我们还是可以通过定义xml的方式来 ...
- android spinner 简书,一步一步自定义spinner
spinner就是下拉选择组件,系统自带的spinner使用起来非常方便,首先定义一个array(strings.xml),如下: 一年级 二年级 三年级 四年级 五年级 六年级 代码如下: Spin ...
- Android 自定义 spinner (背景、字体颜色)
转自:http://blog.sina.com.cn/s/blog_3e333c4a010151cj.html 1.准备两张图片,并做好9.png 2.在drawable中定义spinner_sele ...
- 一步一步自定义spinner
目录 前言 (1)改变初始布局 (2)改变列表item布局 (3)改变弹窗背景及位置 (4)添加选中效果 源码 前言 spinner就是下拉选择组件,系统自带的spinner使用起来非常方便,首先定义 ...
- android spinner布局,重拾Android之路之Spinner
引言 最近做的项目想仿做滴滴出行首页的悬浮框. 正文 效果参考滴滴出行; 工欲善其事,必先利其器!来...... Spinner详解 Spinner控件初始化时,会调用它的选择监听事件,默认选择第一个 ...
- android 自定义dialog 定时关闭,Android编程实现自定义Dialog的大小自动控制方法示例...
本文实例讲述了Android编程实现自定义Dialog的大小自动控制方法.分享给大家供大家参考,具体如下: Android应用开发中,无论是出于功能还是增加用户体验,弹出对话框(Dialog)进行一些 ...
最新文章
- mysql 5.7快速部署
- 哈希表建立及冲突处理
- 计算机专业勤学善思感悟,勤学善思作文600字
- 说说牛顿迭代 -- 方法篇
- Java 序列化 之 Serializable
- 现代软件工程系列 学生的精彩文章 (3) 如何在Bug 不断的情况下还能保持平常心... [zz]
- android 录音机 apk,实时录音机
- 【图像分割】基于matlab随机游走算法图像分割【含Matlab源码 149期】
- Fantastic-Matplotlib 第二回
- 删除Linux中的.swp文件
- day2 用户体验及用户需求(用户体验五要素、需求、需求收集、需求池)
- Sentinel SuperPro/UltraPro Monitor v2.01
- 扬帆致远跨境电商:跨境电商品牌如何锁定真实用户
- CodeMirror 格式化内容和内容选择CodeMirror 官方文档
- 全球首届VueConf演讲PPT和视频免费公开
- 数据分析编程检验——车流量统计(不能使用pandas和numpy)
- 电脑突然断电蓝屏导致Git错误的一种解决办法
- Javaweb + MVC 实现企业人员管理系统全过程记录(配项目所有代码及数据库文件)
- java安全级别设置_怎么调整java安全级别
- 复数集合作为数域C和数域R上的空间