您的位置:首页 > 移动开发 > Android开发

android开发步步为营之28:自定义Menu

2014-09-23 22:00 375 查看
一般我们使用OptionMenu已经能够满足设计上的需求了,但是有时候如果把菜单设计的特别一些,那就需要我们自己来创建菜单了,这里呢,我使用自定义的AlertDialog来实现,让AlertDialog弹出一个放置GridView的页面,达到模拟OptionMenu的效果。Gridview用来显示图片+文字比较好用。好,开始我们的实验。

第一步、设计界面

自定义菜单页面custommenu.xml,放置了一个GridView

<?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" android:baselineAligned="true">

<GridViewandroid: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="bottom"

/>

</LinearLayout>

菜单选项界面menuitem.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">

<ImageViewandroid:id="@+id/item_image"

android:layout_centerHorizontal="true"android:layout_width="wrap_content"

android:layout_height="wrap_content"></ImageView>

<TextViewandroid: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>

第二步、设计Activity CustomMenuActivity.java

/**

* zhuzhifei

* 20111127

*/

package com.figo.helloworld;

import java.util.ArrayList;

import java.util.HashMap;

import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.content.DialogInterface.OnKeyListener;

import android.os.Bundle;

import android.view.KeyEvent;

import android.view.Menu;

import android.view.View;

import android.view.Window;

import android.view.WindowManager;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.GridView;

import android.widget.SimpleAdapter;

import android.widget.Toast;

/**

* @author Administrator

*

*/

public class CustomMenuActivity extends Activity {

private boolean isMore = true;// menu菜单翻页控制

AlertDialog menuDialog;// 通过alertdialog弹出自定义menu菜单

GridView menuGrid;//放置menu选项

View menuView;//从xml文件inflateview

private final int ITEM_SEARCH = 0;// 搜索

private final int ITEM_FILE_MANAGER = 1;// 文件管理

private final int ITEM_DOWN_MANAGER = 2;// 下载管理

private final int ITEM_FULLSCREEN = 3;// 全屏

private final int ITEM_MORE = 11;// 菜单

/** 菜单图片 **/

int[] menu_image_array = { R.drawable.icon, R.drawable.icon,

R.drawable.icon, R.drawable.icon, R.drawable.icon, R.drawable.icon,

R.drawable.icon, R.drawable.icon, R.drawable.icon, R.drawable.icon,

R.drawable.icon, R.drawable.icon };

/** 菜单文字 **/

String[] menu_name_array = { "搜索", "文件管理", "下载管理", "全屏", "网址", "书签",

"加入书签", "分享页面", "退出", "夜间模式", "刷新", "更多..." };

/** 菜单图片2 **/

int[] menu_image_array2 = { R.drawable.icon, R.drawable.icon,

R.drawable.icon, R.drawable.icon, R.drawable.icon, R.drawable.icon,

R.drawable.icon, R.drawable.icon, R.drawable.icon, R.drawable.icon,

R.drawable.icon, R.drawable.icon };

/** 菜单文字2 **/

String[] menu_name_array2 = { "自动横屏", "笔选模式", "阅读模式", "浏览模式", "快捷翻页",

"检查更新", "检查网络", "定时刷新", "设置", "帮助", "关于", "返回" };

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generatedmethod stub

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

CreatCustomMenu();//AlertDialog+GridView创建自定义菜单

}

//AlertDialog+GridView创建自定义菜单

private void CreatCustomMenu()

{

menuView = View.inflate(this, R.layout.custommenu, null);

// 创建AlertDialog

menuDialog = new AlertDialog.Builder(this).create();

menuDialog.setView(menuView);

//调整alertdialog位置来调整自定义Menu

Window w=menuDialog.getWindow();

WindowManager.LayoutParams lp =w.getAttributes();

lp.x=0;

lp.y=150;

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 ITEM_SEARCH:

//这里只是给个提示,一般可以跳转到menuitem对应的activity去

Toast.makeText(getApplicationContext(), "搜索", Toast.LENGTH_SHORT).show();

// 搜索

break;

case ITEM_FILE_MANAGER:

Toast.makeText(getApplicationContext(), "文件管理", Toast.LENGTH_SHORT).show();

// 文件管理

break;

case ITEM_DOWN_MANAGER:

Toast.makeText(getApplicationContext(), "下载管理", Toast.LENGTH_SHORT).show();

// 下载管理

break;

case ITEM_FULLSCREEN:

Toast.makeText(getApplicationContext(), "全屏", Toast.LENGTH_SHORT).show();

// 全屏

break;

case ITEM_MORE:

Toast.makeText(getApplicationContext(), "翻页", Toast.LENGTH_SHORT).show();

// 翻页

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;

}

break;

}

}

});

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

menu.add("menu");

// 必须创建一项,不然点menu按钮没反应

return super.onCreateOptionsMenu(menu);

}

//创建adapter给gridview提供数据源

private SimpleAdapter getMenuAdapter(String[] menuNameArray,

int[] imageResourceArray) {

ArrayList<HashMap<String, Object>> data = newArrayList<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.menuitem, 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) {

CreatCustomMenu();//AlertDialog+GridView创建自定义菜单

} else {

menuDialog.show();

}

return false;// 返回为true 则显示系统menu

}

}

第三步、AndroidManifest.xml注册我们的Activity

<activity android:name=".CustomMenuActivity" android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

第四步、运行效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: