本文介绍一个超简单的自己定义主菜单。效果例如以下:

原理:事实上就是对原生的Dialog的一个简单的封装。并加上显示和隐藏的动画效果。再给控件加上回调事件。

TestDialog.java

public class TestDialog implements OnClickListener {
private Context mContext;
private Dialog mDialog;
private Display mDisplay;
private TextView mTitle;
private TextView mOk, mCancel;
private LinearLayout mContent;
private List<String> mItems = null;
private List<OnCustomItemClickListener> mListeners = null;
private List<Drawable> mDrawables = null; public TestDialog(Context context) {
this.mContext = context;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mDisplay = windowManager.getDefaultDisplay();
} /**
* builder()创建
*
* @return
*/
public TestDialog builder(int layout) {
initView(layout);
return this;
} /**
* 初始化Dialog视图的方法
*
* @param layout
*/
private void initView(int layout) {
View view = LayoutInflater.from(mContext).inflate(layout, null);
view.setMinimumWidth(mDisplay.getWidth());
//
mTitle = (TextView) view.findViewById(R.id.menu_title);
mContent = (LinearLayout) view.findViewById(R.id.menu_content);
mOk = (TextView) view.findViewById(R.id.menu_ok);
mCancel = (TextView) view.findViewById(R.id.menu_cancel);
mOk.setOnClickListener(this);
mCancel.setOnClickListener(this);
mDialog = new Dialog(mContext, R.style.DialogStyle);
mDialog.setContentView(view);
Window dialogWindow = mDialog.getWindow();
dialogWindow.setGravity(Gravity.LEFT | Gravity.BOTTOM);
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
lp.x = 0;
lp.y = 0;
dialogWindow.setAttributes(lp);
} /**
*
* @param 能否取消
* @return
*/
public TestDialog setCancelable(boolean b) {
if (mDialog != null) {
mDialog.setCancelable(b);
}
return this;
} /**
* 设置对话框标题
*
* @param title
* @return
*/
public TestDialog setTitle(String title) {
if (mDialog != null) {
mTitle.setText(title);
mTitle.setVisibility(View.VISIBLE);
}
return this;
} /**
*
* @param 点击Dialog以外的部分能否够取消
* @return
*/ public TestDialog set(boolean b) {
if (mDialog != null) {
mDialog.setCanceledOnTouchOutside(b);
}
return this;
} /**
* 取消
*/
public void dismiss() {
mDialog.dismiss();
} /**
* 用来装视图数据的集合
*
* @param title
* @return
*/
public TestDialog addItem(String title, Drawable drawable, OnCustomItemClickListener clickListener) {
if (mItems == null) {
mItems = new ArrayList<String>();
}
if (mListeners == null) {
mListeners = new ArrayList<TestDialog.OnCustomItemClickListener>();
}
if (mDrawables == null) {
mDrawables = new ArrayList<Drawable>();
}
mItems.add(title);
mListeners.add(clickListener);
mDrawables.add(drawable);
return this;
} private void setItem() {
if (mItems == null || mItems.size() <= 0) {
return;
}
int count = mItems.size();
for (int i = 0; i < count; i++) {
final int index = i;
TextView view = new TextView(mContext);
view.setText("object" + 1);
view.setCompoundDrawablesRelativeWithIntrinsicBounds(null, mDrawables.get(i), null, null);
view.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
mListeners.get(index).onClick(index);
}
});
mContent.addView(view);
}
} public void show() {
setItem();
mDialog.show();
} public interface OnCustomItemClickListener {
public abstract void onClick(int v);
} @Override
public void onClick(View v) {
if (v == mOk) { } else if (v == mCancel) { }
mDialog.dismiss(); } }

用到的Teme:

<style name="DialogStyle" parent="@android:style/Theme.Dialog">

        <!-- 背景透明 -->
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<!-- 浮于Activity之上 -->
<item name="android:windowIsFloating">true</item>
<!-- 边框 -->
<item name="android:windowFrame">@null</item>
<!-- Dialog以外的区域模糊效果 -->
<item name="android:backgroundDimEnabled">true</item>
<!-- 无标题 -->
<item name="android:windowNoTitle">true</item>
<!-- 半透明 -->
<item name="android:windowIsTranslucent">true</item>
<!-- Dialog进入及退出动画 -->
<item name="android:windowAnimationStyle">@style/ActionSheetDialogAnimation</item>
</style> <style name="ActionSheetDialogAnimation" parent="@android:style/Animation.Dialog">
<item name="android:windowEnterAnimation">@anim/dialog_in</item>
<item name="android:windowExitAnimation">@anim/dialog_out</item>
</style>

动画文件:

dialog_in.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:fromYDelta="100%"
android:toYDelta="0" />

dialog_out.xml

<?

xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="200"
android:fromYDelta="0"
android:toYDelta="100%" />

用到的布局文件:

<?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:background="@android:color/white"
android:orientation="vertical" > <TextView
android:id="@+id/menu_title"
android:layout_width="match_parent"
android:layout_height="45dip"
android:background="@drawable/menu_item_background"
android:gravity="center"
android:visibility="gone" /> <LinearLayout
android:id="@+id/menu_content"
android:layout_width="match_parent"
android:layout_height="150dip"
android:gravity="center_vertical"
android:orientation="horizontal" >
</LinearLayout> <View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@android:color/darker_gray" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="45dip"
android:orientation="horizontal" > <TextView
android:id="@+id/menu_ok"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/menu_item_background"
android:gravity="center"
android:text="@string/menu_ok" /> <View
android:layout_width="1px"
android:layout_height="match_parent"
android:background="@android:color/darker_gray" /> <TextView
android:id="@+id/menu_cancel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/menu_item_background"
android:gravity="center"
android:text="@string/menu_cancel" />
</LinearLayout> </LinearLayout>

用到的背景

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

    <item android:drawable="@android:color/darker_gray" android:state_focused="true"></item>
<item android:drawable="@android:color/darker_gray" android:state_pressed="true"></item>
<item android:drawable="@android:color/white"></item> </selector>

在Activity中使用:

findViewById(R.id.click).setOnClickListener(new OnClickListener() {

			@Override
public void onClick(View v) {
// TODO Auto-generated method stub
TestDialog dialog = new TestDialog(MainActivity.this);
dialog.builder(R.layout.menu);
dialog.setCancelable(false);
dialog.addItem("微博1", getResources().getDrawable(R.drawable.ic_weibo), new OnCustomItemClickListener() { @Override
public void onClick(int v) {
Toast.makeText(getBaseContext(), "1", 1).show();
}
});
dialog.addItem("微博2", getResources().getDrawable(R.drawable.ic_weibo), new OnCustomItemClickListener() { @Override
public void onClick(int v) {
Toast.makeText(getBaseContext(), "3", 1).show();
}
});
dialog.show();
}
});

Android 自己定义主菜单的更多相关文章

  1. android 怎样将主菜单图标改成按安装时间排序

    1. 在 LauncherModel.java 中增加例如以下代码, 假设是KK Launcher3 ApplicationInfo要替换为AppInfo public static final Co ...

  2. android 实现自定义卫星菜单

    看了hyman老师的视频,听起来有点迷糊,所以就想把实现卫星菜单的实现总结一下.长话短说,下面总结一下: 一.自定义ViewGroup1).自定义属性文件 属性的定义: <attr name=& ...

  3. Android自己定义组件系列【4】——自己定义ViewGroup实现双側滑动

    在上一篇文章<Android自己定义组件系列[3]--自己定义ViewGroup实现側滑>中实现了仿Facebook和人人网的側滑效果,这一篇我们将接着上一篇来实现双面滑动的效果. 1.布 ...

  4. Android的onCreateOptionsMenu()创建菜单Menu详解(转)

    Android一共有三种形式的菜单:            1.选项菜单(optinosMenu)            2.上下文菜单(ContextMenu)            3.子菜单(s ...

  5. Android的onCreateOptionsMenu()创建菜单Menu详解

    Android一共有三种形式的菜单:            1.选项菜单(optinosMenu)            2.上下文菜单(ContextMenu)            3.子菜单(s ...

  6. android学习笔记23——菜单

    菜单在桌面应用程序中使用非常广泛,由于手机屏幕的制约,菜单在手机应用中减少不少. android应用中的菜单默认是不可见的,只有当用户单击手机上“Menu”键时,系统才会显示该应用关联的采用项. an ...

  7. android学习日记24--Android 菜单开发

    菜单是任何应用程序必不可少的一项.按下Menu键或者长按某个View就会弹出相应菜单,当然前提是应用程序有实现菜单功能. Android平台下的菜单有:Options Menu(选项菜单).Subme ...

  8. 【转】Android的onCreateOptionsMenu()创建菜单Menu详解

    原文网址:http://www.linuxidc.com/Linux/2012-02/55500.htm Android一共有三种形式的菜单:            1.选项菜单(optinosMen ...

  9. Android 自己定义ScrollView ListView 体验各种纵向滑动的需求

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38950509.本文出自[张鸿洋的博客] 1.概述 群里的一个哥们有个需求是这种: ...

随机推荐

  1. iOS使用push隐藏子页面底部bottom TabBar

    下面两种情况是我在开发过程中遇到的,一种是代码使用pushViewController,还有一种是storyboard直接使用push.之前也查阅了非常多关于隐藏底部tabbar的资料.可是要么使用起 ...

  2. 修正EasyUI的BUG——Form中存在FileBox时的数据载入错误

    使用EasyUI载入服务端返回的数据时经常使用 $('#fm').form('load', row); 实现,既方便又简洁,可是.当Form中包括有FileBox时,代码就会报错,经过跟踪发现.由于E ...

  3. Razor数组数据

    控制器层 public ActionResult DemoArray() { Product[] array = { new Product {Name = "Kayak", Pr ...

  4. AC自动机 hdu2222

    #include <iostream> using namespace std; struct Node{ Node *next[]; Node* fail; int count; Nod ...

  5. Impala储存与分区

    不多说,直接上干货! hive的元数据存储在/user/hadoop/warehouse Impala的内部表也在/user/hadoop/warehouse. 那两者怎么区分,看前面的第一列. 下面 ...

  6. 使用Redis配置JAVA_环境

    配置环境变量 1.安装完成后,右击"我的电脑",点击"属性",选择"高级系统设置": 2.选择"高级"选项卡,点击&qu ...

  7. Java基础学习总结(21)——常用正则表达式列表

    很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求.所以我最近把开发中常用的一些正则表达式整理了一下,包括校验数字.字符.一些特殊的需求等等.给自己留个 ...

  8. UVALive 5292 Critical Links

    Critical Links Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Ori ...

  9. error c2572重定义默认參数

    因为想省事.在声明过函数之后直接复制粘贴去实现,结果出现error c2572重定义默认參数 顾名思义.该默认參数被定义多次.在一个文件(或一个作用域)中,仅仅能为形參指定默认 实參一次.在编译的时候 ...

  10. 取消xp开机默认登陆账户

    取消xp开机默认登陆账户 建了个新用户,把以前的用户删除后重新启动电脑,始终停留在 "正在启动" 界面,网上说是 Event Log:Eventlog(系统日志纪录服务) 没有自动 ...