文档章节

Android popwindow的使用例子

竹草席
 竹草席
发布于 2015/05/19 22:35
字数 673
阅读 85
收藏 1

popwindow可以在你指定的地方弹出一个框来显示你想要的内容,貌似系统的spinner也是用的popwind来实现的(其中的一种方式),所以 想自定义一个控制更容易的下拉框用popwindow比较简单好实现

具体代码:

此类用来呈现下来框的点击按钮多个可以水平滑动

public class PullDownController extends HorizontalScrollView implements ComBoxCallBack

{


public ArrayList<ComBox> comBoxs_list;

MXPullDownMenuCallBack callBack;

Context context;

LinearLayout linearLayout;

public PullDownController(Context context, MXPullDownMenuCallBack callBack)

{

super(context);

this.context = context;

this.callBack = callBack;

linearLayout = new LinearLayout(context);

linearLayout.setOrientation(LinearLayout.HORIZONTAL);

comBoxs_list = new ArrayList<ComBox>();

setBackgroundColor(Color.BLUE);

int count = callBack.numberOfColumnsInMenu(this);

for(int i=0; i<count; i++)

{

ComBox comBox =new ComBox(context, this, i);

comBoxs_list.add(comBox);

linearLayout.addView(comBox,new LayoutParams(100, LayoutParams.MATCH_PARENT));

}

linearLayout.setGravity(Gravity.CENTER);

linearLayout.setBackgroundColor(Color.YELLOW);

addView(linearLayout,new LayoutParams(200,50));

}


public interface MXPullDownMenuCallBack

{

public int numberOfColumnsInMenu(PullDownController menu);// 返回有多少列


public String currentTitleForColumn(PullDownController menu, int currentTitleForColumn);// 列标题


public ArrayList<String> inforOfRowsInColumn(PullDownController menu, int numberOfRowsInColumn);// 一列包含的全部行


public int sizeOfTitleForColum(PullDownController menu, int column);


public void SelectRowAtColumn(PullDownController menu, int column, int row);

}


@Override

public void OnComBoxItemClick(int column, int row)

{

callBack.SelectRowAtColumn(this, column, row);

}


@Override

public ArrayList<String> getListDataSource(int column)

{

return callBack.inforOfRowsInColumn(this, column);

}


@Override

public String currentTitleForColumn(int column)

{

return callBack.currentTitleForColumn(this, column);

}


public void ondestroy()

{

if (null != comBoxs_list || !comBoxs_list.isEmpty())

{

for (ComBox comBox : comBoxs_list)

{

comBox = null;

}

comBoxs_list.clear();

}

}

}

此类用来实现点击后popwindow弹出的内容

public class ComBox extends LinearLayout

{

PopupWindow popupWindow;

Context context;

LinearLayout combox_layout;

TextView combox_text;

ImageView combox_image;

int column = 0;

ComBoxCallBack callBack;



public ComBox(Context context, ComBoxCallBack callBack, int column)

{

super(context);

this.context = context;

this.callBack = callBack;

this.column = column;

LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

combox_layout = (LinearLayout) inflater.inflate(R.layout.combox_layout, null);

combox_layout.setBackgroundResource(R.drawable.cell_left_title);

combox_text = (TextView) combox_layout.findViewById(R.id.combox_text);

combox_image = (ImageView) combox_layout.findViewById(R.id.combox_image);

combox_text.setText(callBack.currentTitleForColumn(column));

combox_layout.setOnClickListener(new OnClickListener()

{

@Override

public void onClick(View v)

{

showList(v);

}

});

addView(combox_layout, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

}


public void setOnComBoxItemClick(ComBoxCallBack callBack)

{

this.callBack = callBack;

}


public void showList(View view)

{

// 一个自定义的布局,作为显示的内容

ListView list = new ListView(context);

list.setAdapter(new ArrayAdapter<String>(context, R.layout.spinner_item, callBack.getListDataSource(column)));

list.setOnItemClickListener(new OnItemClickListener()

{

@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long id)

{

combox_text.setText(parent.getItemAtPosition(position).toString());

callBack.OnComBoxItemClick(column, position);

popupWindow.dismiss();

popupWindow = null;

}

});

popupWindow = new PopupWindow(list, 100, 200, true);

popupWindow.setTouchable(true);

popupWindow.setClippingEnabled(true);

popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);

popupWindow.setOnDismissListener(new OnDismissListener()

{

@Override

public void onDismiss()

{

popupWindow = null;

}

});

// 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框

popupWindow.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.ic_launcher));

//此处用-200因为上面给出的固定值是200

                popupWindow.showAsDropDown(view, 0, -200 - view.getHeight());

}


public interface ComBoxCallBack

{

public void OnComBoxItemClick(int column, int row);


public ArrayList<String> getListDataSource(int column);


public String currentTitleForColumn(int column);

}

}

这2个类就可以实现最基本简单的下落框功能,用起来也很简单调用的地方实现MXPullDownMenuCallBack即可

由于很简单也就不多做说明,希望大家不要笑话,哪里不好希望大家指出,使我提高学习


例子文件,例子比较混乱,随手试验的http://download.csdn.net/detail/yx19861211/8727587

© 著作权归作者所有

竹草席
粉丝 1
博文 44
码字总数 2945
作品 0
兰州
私信 提问
Android 透明(沉浸式)状态栏设计

一.透明(沉浸式)状态栏设计 通过第三方代码实现透明状态栏的主要代码如下。 用法如下 注意:状态栏透明可能导致布局向上便宜,所以需要设置根布局的android:fitsSystemWindows="true" 二....

IamOkay
2015/01/20
18.7K
0
解决PopupWindow的阴影覆盖问题

版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/108 PopupWindow阴影覆盖问题 最近这段时间需求不是很多,就有时间解决下之前遗留的小尾...

xing_star
05/31
0
0
Android PopWindow的替代品BasePopup

版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/109 背景描述 最近一段时间,又看到了这个开源项目BasePopup,记得最早关注这个项目还是...

xing_star
06/02
0
0
android 页面动画切换 并启动页面只占屏幕的一半

比如现在有2个activity,分别是A和B,当前显示的是A,目前想要实现的是,A页面不动,B页面从右划出,并且是盖在A页面之上,类似popwindow的效果,现在想要滑动过程到一半就停止,屏幕上显示B占一半...

袁光跃
2015/09/25
993
1
Android中自定义Menu

在Android中,默认的Menu菜单一行中最多只能显示3个菜单选项,如果我们想在Menu菜单一行中想显示多于3个菜单选项时,我们可以考虑采用PopWindow结合自定义Layout布局文件来创建自定义菜单。 ...

鉴客
2011/11/14
6.8K
6

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
623
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
32
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
19
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
56
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部