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

本文介绍了一种通过继承Dialog来自定义实现分组信息的方法。该方法允许在点击对话框以外区域时关闭对话框,并提供了具体的实现代码示例,包括如何设置对话框样式和位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好久又没有更新博客了,呵呵,最近在找工作。现在献上我今天刚做的一个效果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.youkuaiyun.com/detail/jiahui524/4071659

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值