其实就是很简单的控件自定义,只不过这两天项目用到,还是到处搜改了下,现简单记录。方便有需要的时候修改为自己使用:

需求

一个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相关推荐

  1. android hint格式,自定义Spinner样式以及实现hint效果

    android中有个Spinner控件,也就是下拉控件.但是初始的样式比较不好看,所以想着更改下样式.这样就不需要一直用EditText+popupwindow的方式来实现这种效果,会比较这种方式更简 ...

  2. Android开发之自定义Spinner样式的效果实现(源代码实现)

    android系统自带的Spinner样式是远远满足不了我们实际开发过程中对Spinner UI风格的要求,因此我们肯定需要为了切合整个应用的风格,修改我们的Spinner样式.系统给我们提供了两种常 ...

  3. android spinner自定义样式,android自定义Spinner下拉菜单(下拉列表框)样式

    在Android中Spinner就是下拉菜单,它相当于HTML中的标签. Android中提供的Spinner Widget下拉菜单已经非常好用了,样式也适用, 不过我们还是可以通过定义xml的方式来 ...

  4. android自定义下拉筛选,android自定义Spinner下拉菜单(下拉列表框)样式

    在Android中Spinner就是下拉菜单,它相当于HTML中的标签. Android中提供的Spinner Widget下拉菜单已经非常好用了,样式也适用, 不过我们还是可以通过定义xml的方式来 ...

  5. android spinner 简书,一步一步自定义spinner

    spinner就是下拉选择组件,系统自带的spinner使用起来非常方便,首先定义一个array(strings.xml),如下: 一年级 二年级 三年级 四年级 五年级 六年级 代码如下: Spin ...

  6. Android 自定义 spinner (背景、字体颜色)

    转自:http://blog.sina.com.cn/s/blog_3e333c4a010151cj.html 1.准备两张图片,并做好9.png 2.在drawable中定义spinner_sele ...

  7. 一步一步自定义spinner

    目录 前言 (1)改变初始布局 (2)改变列表item布局 (3)改变弹窗背景及位置 (4)添加选中效果 源码 前言 spinner就是下拉选择组件,系统自带的spinner使用起来非常方便,首先定义 ...

  8. android spinner布局,重拾Android之路之Spinner

    引言 最近做的项目想仿做滴滴出行首页的悬浮框. 正文 效果参考滴滴出行; 工欲善其事,必先利其器!来...... Spinner详解 Spinner控件初始化时,会调用它的选择监听事件,默认选择第一个 ...

  9. android 自定义dialog 定时关闭,Android编程实现自定义Dialog的大小自动控制方法示例...

    本文实例讲述了Android编程实现自定义Dialog的大小自动控制方法.分享给大家供大家参考,具体如下: Android应用开发中,无论是出于功能还是增加用户体验,弹出对话框(Dialog)进行一些 ...

最新文章

  1. mysql 5.7快速部署
  2. 哈希表建立及冲突处理
  3. 计算机专业勤学善思感悟,勤学善思作文600字
  4. 说说牛顿迭代 -- 方法篇
  5. Java 序列化 之 Serializable
  6. 现代软件工程系列 学生的精彩文章 (3) 如何在Bug 不断的情况下还能保持平常心... [zz]
  7. android 录音机 apk,实时录音机
  8. 【图像分割】基于matlab随机游走算法图像分割【含Matlab源码 149期】
  9. Fantastic-Matplotlib 第二回
  10. 删除Linux中的.swp文件
  11. day2 用户体验及用户需求(用户体验五要素、需求、需求收集、需求池)
  12. Sentinel SuperPro/UltraPro Monitor v2.01
  13. 扬帆致远跨境电商:跨境电商品牌如何锁定真实用户
  14. CodeMirror 格式化内容和内容选择CodeMirror 官方文档
  15. 全球首届VueConf演讲PPT和视频免费公开
  16. 数据分析编程检验——车流量统计(不能使用pandas和numpy)
  17. 电脑突然断电蓝屏导致Git错误的一种解决办法
  18. Javaweb + MVC 实现企业人员管理系统全过程记录(配项目所有代码及数据库文件)
  19. java安全级别设置_怎么调整java安全级别
  20. 复数集合作为数域C和数域R上的空间

热门文章

  1. C++知识点1——基础
  2. ViSP视觉库中实现AprilTag的方法
  3. python3连接oracle教程,Pycharm中Python3连接Oracle
  4. MySQL报错解决方案:2013-Lost connection to MySQL server
  5. Python中str.replace()的使用方法
  6. MySql层级树查询
  7. 基于TestNG 与Selenium 的自动化测试设计与实施
  8. vmware redhat5.4 磁盘阵列 RIDA
  9. sqlserver安装和简单的使用
  10. DV录像带导出一定要用1394