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

原理:事实上就是对原生的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. hdu5372 Segment Game

    Problem Description Lillian is a clever girl so that she has lots of fans and often receives gifts f ...

  2. Unity3D:粒子系统Particle System

    1. GameObject → Create Other  →  Particle System. 2. 选中 Particle System,可看到下列屬性: 3.Particle System: ...

  3. 强悍的 vim —— 删除空行、删除注释以及加注释解注释

    强悍的 vim -- 删除空行.删除注释以及加注释解注释 原文 https://blog.csdn.net/lanchunhui/article/details/51588198 1. 删除空行空行的 ...

  4. js---12对象创建方式,构造器,原型

    <script type="text/javascript"> var o = {}; var o1 = new Object();//这2种方式创建对象是一样的,因为 ...

  5. Spark scheduler

    触发Spark scheduler的入口是调用者代码中的action操作,如groupByKey,first,take,foreach等操作.这些action操作最终会调用SparkContext.r ...

  6. sync---强制将被改变的内容立刻写入磁盘

    sync命令用于强制被改变的内容立刻写入磁盘,更新超块信息. 在Linux/Unix系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘,以提高系统的运行效率.sync命令则 ...

  7. 用了Redis里面的map和set

    map的操作用 hset,hget等 set的操作有 sadd sismember等 参考下面: http://blog.csdn.net/kwsy2008/article/details/48467 ...

  8. UVA 10306 e-Coins(全然背包: 二维限制条件)

    UVA 10306 e-Coins(全然背包: 二维限制条件) option=com_onlinejudge&Itemid=8&page=show_problem&proble ...

  9. SDUT--Pots(二维BFS)

    Pots Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 You are given two pots, having the ...

  10. [NOI.AC#40]Erlang

    链接 题解 显然,最多抽2个集合 如果一直抽一个,前提是该集合有重复的,答案是不同元素的个数+1 如果抽两个,那么最坏情况下,在一个集合中抽到某一个数的次数是这个集合不同元素的个数(因为抽不到重复的) ...