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

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

    13.2 UPDATE正在更新内容.请稍后

  2. java 链接server上的 mongodb 出现 connect time out 问题

    异常信息 十二月 22, 2014 5:27:58 下午 com.mongodb.DBTCPConnector initDirectConnection 警告: Exception executing ...

  3. FocusChange-焦点变化监听事件

    想要监听一个控件的焦点变化情况,发现了一个 view.setOnFocusChangeListener(new OnFocusChangeListener() { ...... } 现在写一个小dem ...

  4. 分享一个js加密的几种方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. C# 开发 —— 数组类对象接口

    数组类型是从抽象基类 Array 派生的引用类型,通过new运算符创建数组并将数组元素初始化为他们的默认值 一维数组 type[] arrayname; 数组的长度不是声明的一部分,而且数组必须在访问 ...

  6. 【Codeforces Round #457 (Div. 2) A】 Jamie and Alarm Snooze

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 暴力往前走x分钟就好. 直到出现7为止. [代码] #include <bits/stdc++.h> using nam ...

  7. Funui-overlay 如何添加theme 的 overlay

    昨天更改theme主题的时候,发现所有仓库下的theme都是共用的.也就是说,如果你更改了52平台下的theme,那么你提交了代码以后,82下也会发生相应的更改.但是,昨天修改的theme属性,只在3 ...

  8. Linux 常用解压缩归档命令

    linux 常见压缩.归档工具 创建压缩工具 压缩工具 后缀 描述 compress/uncompress .Z 早期工具,现在不常见了 gzip/gunzip .gz 进几年比较火的工具 bzip2 ...

  9. golang pipe

    ===============golang pipe============== package main import ( "fmt" "io" ) func ...

  10. React项目编译node内存溢出

    坑爹的node 内存溢出 react开发项目  安装一个插件依赖 ,然后就报错了 报错如下(自己的没有截图出来 这是从别人的截图---报错基本差不多) 之前因为项目大而且旧的原因  使用 过      ...