Android 自己定义主菜单
本文介绍一个超简单的自己定义主菜单。效果例如以下:
原理:事实上就是对原生的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 自己定义主菜单的更多相关文章
- android 怎样将主菜单图标改成按安装时间排序
1. 在 LauncherModel.java 中增加例如以下代码, 假设是KK Launcher3 ApplicationInfo要替换为AppInfo public static final Co ...
- android 实现自定义卫星菜单
看了hyman老师的视频,听起来有点迷糊,所以就想把实现卫星菜单的实现总结一下.长话短说,下面总结一下: 一.自定义ViewGroup1).自定义属性文件 属性的定义: <attr name=& ...
- Android自己定义组件系列【4】——自己定义ViewGroup实现双側滑动
在上一篇文章<Android自己定义组件系列[3]--自己定义ViewGroup实现側滑>中实现了仿Facebook和人人网的側滑效果,这一篇我们将接着上一篇来实现双面滑动的效果. 1.布 ...
- Android的onCreateOptionsMenu()创建菜单Menu详解(转)
Android一共有三种形式的菜单: 1.选项菜单(optinosMenu) 2.上下文菜单(ContextMenu) 3.子菜单(s ...
- Android的onCreateOptionsMenu()创建菜单Menu详解
Android一共有三种形式的菜单: 1.选项菜单(optinosMenu) 2.上下文菜单(ContextMenu) 3.子菜单(s ...
- android学习笔记23——菜单
菜单在桌面应用程序中使用非常广泛,由于手机屏幕的制约,菜单在手机应用中减少不少. android应用中的菜单默认是不可见的,只有当用户单击手机上“Menu”键时,系统才会显示该应用关联的采用项. an ...
- android学习日记24--Android 菜单开发
菜单是任何应用程序必不可少的一项.按下Menu键或者长按某个View就会弹出相应菜单,当然前提是应用程序有实现菜单功能. Android平台下的菜单有:Options Menu(选项菜单).Subme ...
- 【转】Android的onCreateOptionsMenu()创建菜单Menu详解
原文网址:http://www.linuxidc.com/Linux/2012-02/55500.htm Android一共有三种形式的菜单: 1.选项菜单(optinosMen ...
- Android 自己定义ScrollView ListView 体验各种纵向滑动的需求
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38950509.本文出自[张鸿洋的博客] 1.概述 群里的一个哥们有个需求是这种: ...
随机推荐
- Top 16 Java 应用类 - 这些功能再也不用自己写了
Java中有很多应用类.这些类定义静态方法能够解决非常多常见的问题.以下是通过5万个开源项目统计得到的最热门的16个应用类. 类按热门程序排列.类的方法也是按热门程序排序. 浏览这个类能够看看有哪些功 ...
- 思科2960trunk vlan配置及路由IP配置
en conf t vlan id end conf t inter rang gi 0/0/1-x switchport access vlan id no shutdown exit (confi ...
- 带你底层看Sqoop如何转换成MapReduce作业运行的(代码程序)
补充 其实啊,我们知道,sqoop在运行的时候,最终会去转换成mapreduce作业,这个很简单,不多赘述.直接贴出来. 具体这些怎么运行的,见我如下这篇博客.这里只做一个引子. Sqoop Impo ...
- Gym 100952 B. New Job
B. New Job time limit per test 1 second memory limit per test 64 megabytes input standard input outp ...
- 亲测有效的解决在vue cli@3 create 命令执行后 node-sass无法安装上的问题
在使用Vue cli@3 搭建工程手脚架的过程中.当我们选择了采用 sass 处理 css 编译.在使用vue create test 命令行执行到最后.会到以下这步:然后开始报错: Download ...
- reboot---重启Linux系统
reboot命令用来重新启动正在运行的Linux操作系统. 语法 reboot(选项) 选项 -d:重新开机时不把数据写入记录文件/var/tmp/wtmp.本参数具有“-n”参数效果: -f:强制重 ...
- postgresql 不同数据库不同模式下的数据迁移
编写不容易,转载请注明出处谢谢, 数据迁移 因为之前爬虫的时候,一部分数据并没有上传到服务器,在本地.本来用的就是postgresql,也没用多久,数据迁移的时候,也遇到了很多问题,第一次使pg_du ...
- 洛谷——P2093 零件分组
https://www.luogu.org/problem/show?pid=2093 题目描述 某工厂生产一批棍状零件,每个零件都有一定的长度(Li)和重量(Wi).现在为了加工需要,要将它们分成若 ...
- 洛谷 P2360 地下城主
P2360 地下城主 题目描述 你参加了一项秘密任务,在任务过程中你被困在了一个3D的地下监狱里面,任务是计时的,你现在需要在最短的时间里面从地牢里面逃出来继续你的任务.地牢由若干层组成,每一层的形状 ...
- 摆脱技术思维,转向产品思维——寻找“万能”IDC的苦恼
背景:近期在新产品的开发任务完毕后一直在为寻找好的IDC和优质的托管服务忙碌.需求源自于我们重点要解决之前老版产品面临的国内外用户訪问速度慢甚至连接不上的问题. 除去架构技术上使用高性能.可扩展的方案 ...