- 浏览: 138562 次
- 性别:
文章分类
最新评论
Android 系统菜单与自定义菜单实现方法如下:
系统菜单显示DefaultMenu.java
package com.wxz.menu; import com.wxz.menu.R; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class DefaultMenu extends Activity { private Button btnCustomizeMenu; private TextView tvTip; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); this.setTitle("Android 系统菜单"); btnCustomizeMenu = (Button)findViewById(R.id.btnCustomizeMenu); btnCustomizeMenu.setOnClickListener(new ClickEvent()); tvTip = (TextView)findViewById(R.id.tvTip); tvTip.setText("请按Menu键(F2)显示系统菜单"); } class ClickEvent implements View.OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub if(v==btnCustomizeMenu){ Intent it = new Intent(); it.setClass(DefaultMenu.this, CustomizeMenu.class); startActivity(it); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { /* * * add()方法的四个参数,依次是: * * 1、组别,如果不分组的话就写Menu.NONE, * * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单 * * 3、顺序,那个菜单现在在前面由这个参数的大小决定 * * 4、文本,菜单的显示文本 */ menu.add(Menu.NONE, Menu.FIRST + 1, 2, "删除").setIcon( android.R.drawable.ic_menu_delete); // setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,以 // android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的 menu.add(Menu.NONE, Menu.FIRST + 2, 3, "保存").setIcon( android.R.drawable.ic_menu_edit); menu.add(Menu.NONE, Menu.FIRST + 3, 4, "帮助").setIcon( android.R.drawable.ic_menu_help); menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon( android.R.drawable.ic_menu_add); //返回true则显示,返回false则不显示 return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case Menu.FIRST + 1: Toast.makeText(this, "删除菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 2: Toast.makeText(this, "保存菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 3: Toast.makeText(this, "帮助菜单被点击了", Toast.LENGTH_LONG).show(); break; case Menu.FIRST + 4: Toast.makeText(this, "添加菜单被点击了", Toast.LENGTH_LONG).show(); break; } // 返回false则正常显示,返回true则被消费掉 return false; } @Override public void onOptionsMenuClosed(Menu menu) { Toast.makeText(this, "选项菜单关闭了", Toast.LENGTH_LONG).show(); } @Override public boolean onPrepareOptionsMenu(Menu menu) { Toast.makeText(this, "选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单", Toast.LENGTH_LONG).show(); // 如果返回false,此方法就把用户点击menu的动作给消费了,onCreateOptionsMenu方法将不会被调用 return true; } }
自定义菜单显示CustomizeMenu.java
package com.wxz.menu; import java.util.ArrayList; import java.util.HashMap; import com.wxz.menu.R; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.DialogInterface.OnKeyListener; import android.os.Bundle; import android.view.KeyEvent; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.GridView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; import android.widget.AdapterView.OnItemClickListener; public class CustomizeMenu extends Activity { private Button btnCustomizeMenu; private Button btnDefaultMenu; private TextView tvTip; private Context mContext; private boolean isMore = true;// menu菜单翻页控制 AlertDialog menuDialog;// menu菜单Dialog GridView menuGrid; View menuView; // 菜单图片 int[] menu_image_array = { R.drawable.menu_search, R.drawable.menu_bookmark, R.drawable.menu_bookmark_sync_import, R.drawable.menu_sharepage, R.drawable.menu_quit, R.drawable.menu_nightmode, R.drawable.menu_refresh, R.drawable.menu_more }; // 菜单文字 String[] menu_name_array = { "搜索", "书签", "加入书签", "分享页面", "退出", "夜间模式", "刷新", "更多" }; // 菜单图片2 int[] menu_image_array2 = { R.drawable.menu_auto_landscape, R.drawable.menu_checkupdate, R.drawable.menu_checknet, R.drawable.menu_refreshtimer, R.drawable.menu_syssettings, R.drawable.menu_help, R.drawable.menu_about, R.drawable.menu_return }; // 菜单文字2 String[] menu_name_array2 = { "自动横屏", "检查更新", "检查网络", "定时刷新", "设置", "帮助", "关于", "返回" }; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); mContext = CustomizeMenu.this; this.setTitle("Android 自定义菜单"); btnCustomizeMenu = (Button) findViewById(R.id.btnCustomizeMenu); btnCustomizeMenu.setVisibility(View.GONE); btnDefaultMenu = (Button) findViewById(R.id.btnDefaultMenu); btnDefaultMenu.setVisibility(View.VISIBLE); btnDefaultMenu.setOnClickListener(new ClickEvent()); tvTip = (TextView) findViewById(R.id.tvTip); tvTip.setText("请按Menu键(F2)显示自定义菜单"); menuView = View.inflate(this, R.layout.gridview_menu, null); // 创建AlertDialog menuDialog = new AlertDialog.Builder(this).create(); menuDialog.setView(menuView); menuDialog.setOnKeyListener(new OnKeyListener() { public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU)// 监听按键 dialog.dismiss(); return false; } }); menuGrid = (GridView) menuView.findViewById(R.id.gridview); menuGrid.setAdapter(getMenuAdapter(menu_name_array, menu_image_array)); /** 监听menu选项 **/ menuGrid.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { switch (arg2) { case 0:// 搜索,自动横屏 if (isMore) Toast.makeText(mContext, "点击了搜索", Toast.LENGTH_SHORT).show(); else Toast.makeText(mContext, "点击了自动横屏", Toast.LENGTH_SHORT).show(); break; case 1:// 书签,检查更新 if (isMore) Toast.makeText(mContext, "点击了书签", Toast.LENGTH_SHORT).show(); else Toast.makeText(mContext, "点击了检查更新", Toast.LENGTH_SHORT).show(); break; case 2:// 加入书签,检查网络 if (isMore) Toast.makeText(mContext, "点击了加入书签", Toast.LENGTH_SHORT).show(); else Toast.makeText(mContext, "点击了检查网络", Toast.LENGTH_SHORT).show(); break; case 3:// 分享页面,定时刷新 if (isMore) Toast.makeText(mContext, "点击了分享页面", Toast.LENGTH_SHORT).show(); else Toast.makeText(mContext, "点击了定时刷新", Toast.LENGTH_SHORT).show(); break; case 7:// 更多 if (isMore) { menuGrid.setAdapter(getMenuAdapter(menu_name_array2, menu_image_array2)); isMore = false; } else {// 首页 menuGrid.setAdapter(getMenuAdapter(menu_name_array, menu_image_array)); isMore = true; } menuGrid.invalidate();// 更新menu menuGrid.setSelection(7); break; default://退出, 夜间模式,刷新,设置,帮助,关于 Toast.makeText(mContext, "点击了其它菜单项", Toast.LENGTH_SHORT).show(); break; } } }); } class ClickEvent implements View.OnClickListener { @Override public void onClick(View v) { // TODO Auto-generated method stub if (v == btnDefaultMenu) { Intent it = new Intent(); it.setClass(CustomizeMenu.this, DefaultMenu.class); startActivity(it); } } } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add("menu");// 必须创建一项 return super.onCreateOptionsMenu(menu); } private SimpleAdapter getMenuAdapter(String[] menuNameArray, int[] imageResourceArray) { ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>(); for (int i = 0; i < menuNameArray.length; i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("itemImage", imageResourceArray[i]); map.put("itemText", menuNameArray[i]); data.add(map); } SimpleAdapter simperAdapter = new SimpleAdapter(this, data, R.layout.item_menu, new String[] { "itemImage", "itemText" }, new int[] { R.id.item_image, R.id.item_text }); return simperAdapter; } @Override public boolean onMenuOpened(int featureId, Menu menu) { if (menuDialog == null) { menuDialog = new AlertDialog.Builder(this).setView(menuView).show(); } else { menuDialog.show(); } return false;// 返回为true 则显示系统menu } }
主配置文件main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请点击 Menu键(F2)显示选项菜单" android:id="@+id/tvTip" /> <Button android:id="@+id/btnCustomizeMenu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="自定义菜单"/> <Button android:id="@+id/btnDefaultMenu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" android:text="系统菜单"/> </LinearLayout>
菜单布局表格配置文件gridview_menu.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <GridView android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="4" android:verticalSpacing="10dip" android:horizontalSpacing="10dip" android:stretchMode="columnWidth" android:gravity="center" /> </LinearLayout>
菜单项配置文件item_menu.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/RelativeLayout_Item" android:layout_width="fill_parent" android:layout_height="wrap_content" android:paddingBottom="5dip"> <ImageView android:id="@+id/item_image" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content"> </ImageView> <TextView android:layout_below="@id/item_image" android:id="@+id/item_text" android:layout_centerHorizontal="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="选项"> </TextView> </RelativeLayout>
开发环境:XP3+Eclipse+Android2.2+JDK6.0
测试环境:Android2.2模拟器
源代码:http://download.csdn.net/detail/xinzheng_wang/4452501
发表评论
-
Android onTouchEvent, onClick及onLongClick的调用机制
2012-03-08 15:44 893针对屏幕上的一个View控件,Android如何区分应当触发o ... -
android 常用颜色表
2012-03-09 16:01 920<?xml version="1.0" ... -
android ndk 环境搭建及基本编程思路
2012-03-28 16:09 885本文主要是介绍一下android ndk环境搭建及基本编程思路 ... -
windows下eclipse android-ndkr7b环境配置
2012-03-31 19:49 927注意:android-ndkr7b版本中已经集成了cyg ... -
配置 eclipse ndk 环境遇到的问题
2012-04-01 08:52 1054困惑了两天的环境配置问题,按照网上提供的方法去做总是错误 ... -
Android 配置 OpenCV2.3.1
2012-04-01 17:56 2053OpenCV2.3.1-android中大部分重要的AP ... -
Android中dip与px之间单位转换
2012-04-11 16:10 729/** * 根据手机的分辨率从dip 的单位转成为px(像素 ... -
Android 自定义像素AVD模拟器无键盘
2012-04-18 14:26 3397在Android自定义像素(如:800X480)时,AV ... -
在Android虚拟机AVD中安装APK
2012-04-18 15:13 2711为了方便测试,有时候会需要在自定义的Android虚拟机A ... -
Android SurfaceView onDraw()绘图问题
2012-06-29 11:32 10058在继承SurfaceView的类中即使重写了onDraw ... -
Android 自定义渐变背景
2012-07-04 08:36 1356在Eclipse的Android工程的res下建立dra ... -
Android 隐藏系统状态栏和标题栏
2012-07-04 09:06 1262Android中若想 隐藏系统状态栏和标题栏(全屏显示)的 ... -
Android双SurfaceView实现底部拍照,顶部绘图
2012-07-04 10:36 1541当SurfaceHolder对象的类型设置为Surf ... -
Android数据的四种存储方式之SharedPreferences、SQLite、ContentProvider和File
2012-07-06 15:32 2845Android系统一共提供了四种数据存储方式,分别 ... -
Android SQLite存取图像
2012-07-06 18:36 946Android SQLite存取图像的简单方法如下: ... -
Android 继承SQLiteOpenHelper自定义DBHelper存取数据与图像
2012-07-10 15:07 1417Android 继承SQLiteOpenHelper自定 ... -
Android使用SQLiteDatabase直接存取数据与图像
2012-07-10 15:15 1096Android使用SQLiteDatabase直接存取数 ...
相关推荐
1. **设计一致性**:尽管自定义菜单提供了更大的灵活性,但应保持与Android平台设计原则的一致性,以确保用户能够轻松理解和使用。 2. **响应性**:菜单项的点击反馈应迅速且明显,以提高用户体验。 3. **可访问性**...
QuickContactBadge是一个用于展示联系人快速联系方式的UI组件,通常与自定义菜单结合,提供一键拨号、发送邮件等快捷功能。使用步骤如下: 1. **添加依赖**:确保在项目的build.gradle文件中包含了`androidx....
"Android旋转菜单可自定义个数"是一个非常实用的特性,它允许开发者根据应用需求灵活地设置菜单项的数量,为用户提供更加个性化的体验。这个特性通常用于创建具有动态效果的导航组件,比如在主屏幕或者设置页面中,...
本篇文章将深入探讨如何在Android系统中实现自定义菜单,并提供相关的知识点。 首先,我们来理解Android中的标准菜单(Menu)。在Android中,菜单通常在三种场景下出现:选项菜单(Option Menu)、上下文菜单...
这个"Android 级联菜单,两级菜单自定义实现提供多种方式PopWindow,Fragment引用"的项目,就是一个很好的示例,展示了如何在Android应用中实现一个功能完备、灵活多样的级联菜单。下面将详细介绍该项目中的关键知识...
在Android应用开发中,侧滑菜单(DrawerLayout)是一种常见的设计模式,用于提供导航和功能选项。本实例代码着重讲解如何实现一个支持双向侧滑的自定义控件,即不仅可从左侧滑出,也能从右侧滑出。下面将详细阐述...
本文将深入探讨如何在Android Studio中实现底部自定义菜单,并结合"GreatWallApp"这一项目实例,来讲解相关的编程知识。 首先,底部自定义菜单通常指的是在应用界面底部设置的一排图标或文字按钮,用户可以通过点击...
在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有个性化的...在vgcar这个项目中,你将有机会实践这些概念并构建出自己的自定义菜单栏。记得不断学习和实践,提升自己的Android开发技能。
首先,自定义菜单的基本思想是通过重写或扩展Android系统的默认菜单行为,以达到个性化的目的。在Android中,通常在`onCreateOptionsMenu()`方法中创建菜单,并在`onOptionsItemSelected(MenuItem item)`中处理点击...
总之,创建一个可向四周展开的自定义菜单控件涉及到Android视图体系的深入理解,包括绘图、触摸事件处理、动画和布局管理等多个方面。通过这样的实践,开发者不仅可以提升自身的技术能力,还能为应用程序带来独特的...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且功能丰富的用户界面。本篇文章将深入探讨如何打造一个圆形的遥控器菜单,为用户提供类似电视遥控器的操作体验。这个自定义View将...
总的来说,实现自定义卫星菜单效果涉及理解Android View的工作原理,掌握如何解析和使用自定义属性,以及如何绘制和动画化View。通过这种方式,开发者可以构建出独特且互动性强的用户界面,增强应用的用户体验。在...
然而,系统提供的默认菜单可能无法满足所有设计需求,因此开发者需要创建自定义菜单以实现更复杂的布局和样式。 要实现自定义菜单,我们需要创建一个新的View或者继承已有的View类,比如PopupWindow。PopupWindow是...
4. **集成与交互**: 将自定义的RadioButton和RadioGroup添加到主布局中,然后将它们与ViewPager关联。确保在RadioButton的点击事件中更新ViewPager的当前页面,并同步气泡数字的显示。 5. **动态更新气泡数字**: 在...
本示例完整实现了自定义下拉菜单的功能,初学者可快速掌握自定义下拉菜单的技巧,有关具体的实现细节请参考博文:http://blog.csdn.net/l1028386804/article/details/48101651
在`res/menu`目录下创建一个XML文件,例如`custom_menu.xml`,定义你的自定义菜单项。每个菜单项由`<item>`标签表示,可以设置`android:title`、`android:id`、`android:icon`等属性。 ```xml <menu xmlns:android...
"Android自定义扇形菜单"就是一个这样的例子,它提供了与常见Path风格不同的菜单展示方式,创造出一个生动有趣的用户界面元素。下面将详细探讨这个扇形菜单的实现原理、特点以及可能的应用场景。 扇形菜单的设计...
在Android系统中,自定义菜单是一项常见的开发任务,它允许开发者根据应用的需求创建个性化的交互界面。...通过阅读和分析源代码,你可以深入理解Android菜单系统的运作机制,并将其应用于自己的项目中。
在Android开发中,`PopupWindow`是一个非常实用的组件,它可以用来创建弹出式窗口,为用户提供临时的交互界面,比如模拟系统级的下拉菜单、快捷操作菜单等。本篇将详细介绍如何在Android中利用`PopupWindow`来实现...