近期在项目中须要用到下拉菜单。公司比較推崇美团的下拉菜单,于是要实现该功能。想着。这个功能应该是一个常常会用到的。于是何不写一个帮助类,仅仅要往这个类里面传入特定的參数,既能够实现下来菜单,并且还能够实现菜单选择的回调。既能够反复使用,有简单便捷

首先,查看界面效果图

界面倒是比較简单,主要列下功能:

  1. 这个是靠一个帮助类实现的。下次想在自己的项目中实现该功能,一句引用代码,传入特定的參数既能够实现该功能
  2. 菜单弹出的时候。背景变灰色。菜单收回,背景回复白色
  3. 自己主动给选定的选项加入背景色,假设下次选择的其它选项,背景色自己主动切换
  4. 回调菜单的选择项
假设你须要的是一级选择菜单,如上的功能是全然足够了,好了,一下是代码部分:

下拉菜单的帮助类:MenuHelper
public class MenuHelper {
private PopupWindow popupWindow;
private ListView listView;
private List<String> data;
private Context mContext;
private View topView;
private ListAdapter adapter;
private int i = 0;
private FrameLayout container; public MenuHelper(Context context, View topView, final OnMenuClick clickListener, List<String> data, FrameLayout containerView) {
mContext = context;
this.topView = topView;
this.data = data; this.container = containerView;
container.getForeground().setAlpha(0);
topView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showMenu();
}
}); initListView(clickListener);
initPopupWindow(); } private void initListView(final OnMenuClick clickListener) {
listView = new ListView(mContext);
listView.setDivider(null);
listView.setDividerHeight(0);
listView.setBackgroundColor(Color.WHITE);
adapter = new ListAdapter(mContext);
listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<? > parent, View view,
int position, long id) {
i = position;
clickListener.onPopupMenuClick(position);
popupWindow.dismiss();
}
});
} private void initPopupWindow() {
popupWindow = new PopupWindow(listView, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true);
popupWindow.setOutsideTouchable(true);
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE)); popupWindow.setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss() {
if (container != null) {
container.getForeground().setAlpha(0);
}
}
});
} public void showMenu() {
adapter.notifyDataSetChanged();
if (popupWindow.isShowing()) {
popupWindow.dismiss();
}else {
popupWindow.setOutsideTouchable(true);
popupWindow.setTouchable(true);
popupWindow.showAsDropDown(topView, 0, 0);
if (container != null) {
container.getForeground().setAlpha(120);
}
}
} private class ListAdapter extends ArrayAdapter<String> { public ListAdapter(Context context) {
super(context, R.layout.item_text, data);
} private Holder getHolder(final View view) {
Holder holder = (Holder) view.getTag();
if (holder == null) {
holder = new Holder(view);
view.setTag(holder);
}
return holder;
} @Override
public View getView(final int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
rowView = inflater.inflate(R.layout.item_text, null);
}
final Holder holder = getHolder(rowView); holder.textview.setText(data.get(position));
if (position == i) {
holder.textview.setBackgroundColor(mContext.getResources().getColor(R.color.item_press));
}else {
holder.textview.setBackgroundColor(Color.TRANSPARENT);
} return rowView;
} private class Holder {
public TextView textview; public Holder(View view) {
textview = (TextView) view.findViewById(R.id.textView);
}
}
}
}


代码都比較简单,构造函数须要传的參数中的containerView是一个须要变灰色效果的Layout。你能够传或者设置null

以下是回调接口
public interface OnMenuClick {
public void onPopupMenuClick(int position);
}

最后,是MainActivity的代码:

public class MainActivity extends Activity implements OnMenuClick{
private MenuHelper mMenuHelper;
private Button button;
private FrameLayout container;
private List<String> menuData; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); container = (FrameLayout) findViewById(R.id.container);
button = (Button) findViewById(R.id.button); menuData = new ArrayList<String>();
menuData.add("ladfj");
menuData.add("ladfj");
menuData.add("ladfj");
menuData.add("ladfj");
menuData.add("ladfj"); mMenuHelper = new MenuHelper(this, button, this, menuData, container); button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mMenuHelper.showMenu();
}
}); } @Override
public void onPopupMenuClick(int position) {
Log.d("debug", "click position " + position);
} }


好了。自从代码介绍,下拉菜单功能就此实现,下次碰到有下拉菜单的时候,直接五分钟就集成好了

当然,少不了源代码,传送门


參考文档:
Android开发之多级下拉列表菜单实现(仿美团,淘宝等)http://blog.csdn.net/minimicall/article/details/39484493
Blur or dim background when Android PopupWindow active   http://stackoverflow.com/questions/3221488/blur-or-dim-background-when-android-popupwindow-active





Android开发:仿美团下拉列表菜单,帮助类,复用简单的更多相关文章

  1. Android开发之多级下拉列表菜单实现(仿美团,淘宝等)

    注:本文转载于:http://blog.csdn.net/minimicall/article/details/39484493 我们在常用的电商或者旅游APP中,例如美团,手机淘宝等等,都能够看的到 ...

  2. Android开发 ---xml构建选项菜单、上下文菜单(长按显示菜单)、发通知、发送下载通知

    1.activity_main.xml 描述: 定义了一个TextView和三个按钮 <?xml version="1.0" encoding="utf-8&quo ...

  3. Android开发精彩博文收藏——UI界面类

    本文收集整理Android开发中关于UI界面的相关精华博文,共大家参考!本文不定期更新! 1. Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各 ...

  4. Android开发 ---代码创建选项菜单、隐藏菜单项、菜单的生命周期,菜单按钮图标设置、搜索框、xml中设置子菜单

    1.activity_main.xml 描述: 定义了一个按钮 <?xml version="1.0" encoding="utf-8"?> < ...

  5. Android--------WebView+H5开发仿美团 预加载,加载失败和重新加载

    Android嵌入式开发已经占大多数了,很多界面都是以网页的形式展示,WebView可以使得网页轻松的内嵌到app里,还可以直接跟js相互调用. 本博客主要是模仿美团的旅游出行模块的预加载,网页加载失 ...

  6. 【Android开发】问答机器人,聊天类App的开发制作过程记录

    缘起 很久没写项目了,所以单纯的想练练手,正好看到有问答机器人的接口,想到之前也做过聊天项目,为什么不实验一下呢.当然也是简单调用接口的项目,并没有真正的完成问答的算法等等.业余项目,功能不齐全,只实 ...

  7. Android开发--仿微信语音对讲录音

    原文地址:http://www.2cto.com/kf/201502/378704.html 自微信出现以来取得了很好的成绩,语音对讲的实现更加方便了人与人之间的交流.今天来实践一下微信的语音对讲的录 ...

  8. android开发之使用上下文菜单

    android中的上下文菜单类似于PC上的鼠标右键单击,不同的是android上没有鼠标这一概念,更谈不上右键单击,在android中,一般是长按某个View,调出上下文菜单.与OptionsMenu ...

  9. android 开发-(Contextual Menu)上下文菜单的实现

    在android3.0以后,安卓设备不在提供物理的菜单按键,同时,android应用提供了另外的菜单实现机制,来替代之前的菜单创建方式.安卓设备中,平常可以使用长按住某个内容弹出菜单选项.这就是我们需 ...

随机推荐

  1. Vue 使用 prerender-spa-plugin 添加loading

    主要配置代码: new PrerenderSPAPlugin({ staticDir: path.join(__dirname, 'dist'), routes: ['/', '/introducti ...

  2. mysqldump只导出表结构或只导出数据的实现方法【转】

    mysql mysqldump 只导出表结构 不导出数据 mysqldump --opt -d 数据库名 -u root -p > xxx.sql 备份数据库 #mysqldump 数据库名 & ...

  3. 揭开webRTC媒体服务器的神秘面纱——WebRTC媒体服务器&开源项目介绍

    揭开webRTC媒体服务器的神秘面纱--WebRTC媒体服务器&开源项目介绍 WebRTC生态系统是非常庞大的.当我第一次尝试理解WebRTC时,网络资源之多让人难以置信.本文针对webRTC ...

  4. %08lx

    u-boot中代码如下: debug ("Now running in RAM - U-Boot at: %08lx\n", dest_addr); 对应设备上的打印消息如下: N ...

  5. 解决cef中title不现实tooltip的问题

    本文转自:https://blog.csdn.net/hu1340748/article/details/79030569 感谢感谢 最近在使用chromiumFX做项目,突然发现页面标签中的titl ...

  6. webapck编译打包stylus文件

    先安装css-loader.stylus.stylus-loader npm install --save-dev css-loader npm install --save-dev stylus n ...

  7. ASP.NET Web配置使用HTTPS实用案例

    Step by Step 配置使用HTTPS的ASP.NET Web应用 有关HTTPS.SSL以及SSL证书的工作原理,参见 <HTTPS那些事(一)HTTPS原理> <HTTPS ...

  8. Coursera台大机器学习技法课程笔记14-Radial Basis Function Network

    将Radial Basis Function与Network相结合.实际上衡量两个点的相似性:距离越近,值越大. 将神经元换为与距离有关的函数,就是RBF Network: 可以用kernel和RBF ...

  9. 谈谈MySQL中的降序索引 order by id DESC / ASC

    今天这篇主要讲order by 语句中的多个字段asc desc的问题.mysql5中,索引存储的排序方式是ASC的,没有DESC的索引.现在能够理解为啥order by 默认是按照ASC来排序的了吧 ...

  10. jquery.validate.js自定义表单验证

    $(document).ready(function() { //在下列位置输入页面加载的逻辑代码 $("#inputForm").validate({ rules: { seq: ...