Android实现新浪微博中的分组菜单对话框

本文介绍了一种通过继承自Dialog实现自定义分组菜单的方法,并提供了完整的代码示例,包括如何设置Dialog的显示位置及如何响应外部点击使其消失。
 

好久又没有更新博客了,呵呵,最近在找工作。现在献上我今天刚做的一个效果Demo希望能帮助到大家。

实现效果:

 

实现思路:

分组信息其实就是一个Dialog,我们可以通过继承自Dialog来实现我们自己的需求。同时我们需要设置为当我们点击其他地方的时候Dialog能消失。

 

具体实现代码:(注释写在代码中)

package com.jiahui.view;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager.LayoutParams;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import com.jiahui.dialog.R;

/**
 * 继承自Dialog
 * 
 * @author Administrator
 * 
 */
public class MyDialog extends Dialog {

	protected MyDialog(Context context, boolean cancelable,
			OnCancelListener cancelListener) {
		super(context, cancelable, cancelListener);
		// TODO Auto-generated constructor stub
	}

	public MyDialog(Context context, int theme) {
		super(context, theme);
		// TODO Auto-generated constructor stub
	}

	public MyDialog(Context context) {

		// 使用主题
		super(context, R.style.Theme_Transparent);

		setContentView(R.layout.my_menu_dialog);

		// 设置点击这个对话框之外能消失
		setCanceledOnTouchOutside(true);
		// 设置window属性
		LayoutParams a = getWindow().getAttributes();
		a.gravity = Gravity.TOP;
		a.dimAmount = 0; // 去背景遮盖

		getWindow().setAttributes(a);

		initMenu();

	}

	private void initMenu() {

		List<String> menus = new ArrayList<String>();

		menus.add("分组一");
		menus.add("分组二");

		// 准备要添加的数据条目
		List<Map<String, Object>> items = new ArrayList<Map<String, Object>>();

		for (String str : menus) {
			Map<String, Object> map = new HashMap<String, Object>();

			map.put("group", str);
			items.add(map);
		}
		SimpleAdapter simpleAdapter = new SimpleAdapter(getContext(), items,
				R.layout.menu_item, new String[] { "group" },
				new int[] { R.id.item_text });

		ListView mylistview = (ListView) this.findViewById(R.id.mylistview);

		mylistview.setAdapter(simpleAdapter);

	}

	// 设置位置
	public void setPosition(int x, int y) {
		LayoutParams a = getWindow().getAttributes();
		if (-1 != x)
			a.x = x;
		if (-1 != y)
			a.y = y;
		System.out.println("a.x" + a.x);
		System.out.println("a.y" + a.y);
		getWindow().setAttributes(a);
	}

}


 

My_menu_dialog.xml文件中的代码:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/layout_root"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content" >

 

    <ListView

        android:id="@+id/mylistview"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:gravity="center" >

    </ListView>

 

    <Button

        android:id="@+id/close_menu"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="close"

        android:visibility="gone" />

 

</RelativeLayout>


 

Theme.xml文件

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <style name="Theme.Transparent" parent="android:Theme">

        <item name="android:windowBackground">@drawable/dialog_box_2</item>

        <item name="android:windowIsTranslucent">false</item>

        <item name="android:windowContentOverlay">@null</item>

        <item name="android:windowNoTitle">true</item>

        <item name="android:windowIsFloating">true</item>

        <item name="android:backgroundDimEnabled">false</item>

    </style>

</resources>


 

 

测试的Activity代码

package com.jiahui.dialog;

import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;

import com.jiahui.view.MyDialog;

public class MyDialogActivity extends Activity {

	private MyDialog myDialog;

	private Button btngroup;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//设置无标题 
		requestWindowFeature(getWindow().FEATURE_NO_TITLE);
		setContentView(R.layout.main);

		btngroup = (Button) this.findViewById(R.id.btngroup);

		btngroup.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				if (null == myDialog) {
					myDialog = new MyDialog(MyDialogActivity.this);

	
					//如果没有设置无标题的话,这里还要加上标题栏的高度才行,至于如何获取标题栏的高度的话由读者自行解决
					int top = btngroup.getTop();//是获取如果设置了的margin_top
					int height = btngroup.getHeight();
					int y= top + height;
					
					System.out.println("y:"+y);
					// 设置显示的位置
					myDialog.setPosition(-1, y);

				}
				if (myDialog.isShowing()) {
					myDialog.dismiss();
				} else {
					myDialog.show();
				}

			}
		});
	}
}


 继续我的博客风格。分享为快乐之本,有图有真相!

提供源代码下载:

http://download.csdn.net/detail/jiahui524/4071659

如需转载引用请注明出处:http://blog.csdn.net/jiahui524

欢迎大家多多交流。让菜鸟一起成长!

 

PS:另一种实现方式是用PopupWindow实现   http://blog.csdn.net/jiahui524/article/details/7298690

 

这是一个集成目前Android主流优秀第三方组件、优秀好用的自定义控件、实用工具类封装、 以及一些APP共通模块(比如:版本更新、意见反馈、引导界面等等)的开发包,帮助程序员 快速开发自己的APP 已集成第三方开源组件: 网络请求库android-async-http 图片异步加载库universal-image-loader Sqlite数据库操作ormlite-android 社会化分享ShareSDK+短信验证码 Zxing二维码库 百度地图定位SDK 谷歌依赖注入库RoboGuice WebService调用库ksoap2 XML解析XStream 动画开源库nineoldandroids 表单验证库android-validation-komensky 更多优秀开源库等待集成... 已封装工具类: HTTP网络通信工具类(ToolHTTP.java),get/post请求,支持多种接口回调 SOAP协议通信工具类(ToolSOAP.java),基于异步回调请求WebService接口 Sqlite数据库操作工具类(ToolDatabase.java),获取DAO、创建表、删除表等API 提示信息对话框工具类(ToolAlert.java),已集成泡泡、土司、对话框三种提示 文件操作工具类(ToolFile.java),assets/raw/xml/shrePerface/等文件读写API 地图定位工具类(ToolLocation.java),读取GPS状态、请求定位、获取经纬度等方法 社会化分享工具类(ToolShareSDK.java),各大开发平台分享API操作 短信验证码工具类(ToolMSM.java),移动/联通/电信三网发送手机短信验证码、异步回调验 证结果 字符串操作工具类(ToolString.java),生成UUID、非空非NULL逻辑判断、生成MD5等常用共 通方法 数据操作工具类(ToolData.java),自动递归获取表单数据封装成Map、本地数据分页共通方 法等 图片操作工具类(ToolPicture.java),生成二维码、验证码、灰度、合成、圆角、水印等操 作 读取本地资源工具类(ToolResource.java),反射本地资源文件API,避免依赖R文件,方便 jar形式发布 Android单位转换工具类(ToolUnit.java),sp/dp/px互转 自定义Toast工具类(ToolToast.java),自定义背景色、字体颜色、大小、边框等 Properties操作工具类(ToolProperties.java),读写Properties文件操作 网络操作工具类(ToolNetwork.java),获取网络信息、更改切换网络等相关操作 日期操作工具类(ToolDateTime.java),获取日期、日期加减、格式化日期、日期转换等操作 XML操作工具类(ToolXml.java),基于DOM/XMLPullPaser模式解析、生成XML操作 XMPP操作工具类(ToolXMPP.java),基于XMPP协议的相关API操作 适配字体工具类(ToolAutoFit.java),代码根据设备密度自动缩放View的字体大小 LOG相关工具类(ToolLog.java) 功能待续-->切入记录异常日志,并存储文件或上传至服务 器 已封装/收集自定义控件: 兼容低版本的SwitchButton 追加自定义属性Value的CheckBox/RadioButton/RadioGroup/SingleSpinner 圆角提示信息TipsView 圆角图片RoundImageView 自定义样式风格Progres
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值