AndroID SDK本身提供了一种默认创建菜单的机制。但通过这种机制创建的菜单虽然从功能上很完备,但在界面效果上实在是有点“土”。对于一个拥有绚丽界面的程序配上一个有点“土”的菜单,会使用户感觉很怪,甚至会使绚丽的界面大打折扣。实际上,对于如此灵活和强大的AndroID系统,修改菜单的样式只是小菜一碟。为程序加入漂亮菜单的方法很多。在本节先介绍一种比较常用的方法,就是通过onKeyDown事件方法和PopupWindow实现自定义的菜单。至于通过这种技术能否设计出绚丽的菜单效果,那就要看我们的设 计、美学、心理学功底了。
通过6.1.1节介绍的选项菜单可以知道。通过按手机的“Menu”键(是手机上的硬按键,不同手机“Menu”键所在的位置会不同),可以d出选项菜单,再按“Back”键,选项菜单会关闭。那么要想模拟选项菜单的d出和关闭效果,只需要监听这两个键的按下事件即可。并且在“Menu”键按下时使用PopupWindowd出一个窗口作为模拟的选项菜单。下面先来看看如图6.9所示的模拟选项菜单的效果。
从图6.9可以看出,在界面的下方显示了3个菜单项:“首页”、“我的”和“更多”。其中“我的”菜单项的文字和图像是左右水平排列,而另两个菜单项上的文字和图像是上下垂直排列。实际上,这种效果由一个普通的布局文件(menu_layout.xml)完成的,代码如下:
复制代码 代码如下:
<?xml version="1.0"enCoding="utf-8"?>
<linearLayoutxmlns:androID="http://schemas.androID.com/apk/res/androID"
androID:orIEntation="horizontal"androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content"androID:gravity="bottom">
<!-- 第一个菜单项:“首页” -->
<linearLayout androID:ID="@+ID/home"androID:orIEntation="vertical"
androID:layout_wIDth="fill_parent"androID:layout_height="wrap_content"
androID:background="@drawable/button_normal_translucent"
androID:layout_weight="1">
<ImageVIEw androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content"androID:src="@drawable/home"
androID:paddingtop="5dp" />
<TextVIEw androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content"androID:text="首页"
androID:gravity="center" />
</linearLayout>
<!-- 第二个菜单项:“我的” -->
<linearLayout androID:orIEntation="horizontal"
androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content"
androID:background="@drawable/button_normal"androID:layout_weight="1"
androID:gravity="center">
<ImageVIEw androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content" androID:src="@drawable/mine"/>
<TextVIEw androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content" androID:text="我的" />
</linearLayout>
<!-- 第三个菜单项
<linearLayout androID:orIEntation="vertical"
androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content" androID:background="@drawable/button_normal"
androID:layout_weight="1">
<ImageVIEw androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content"androID:src="@drawable/more"
androID:paddingtop="18dp" />
<TextVIEw androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content" androID:text="更多"
androID:gravity="center"androID:paddingtop="5dp"/>
</linearLayout>
</linearLayout>
在编写上面代码之前,别忘了准备几个相关的图像,例如,本例使用了5个图像。其中button_normal_translucent.png用于“首页”菜单项的背景(半透明效果),button_normal.png用于“我的”和“更多”菜单项的背景。home.png、mine.png和more.png分别用于这三个菜单项的图像。
下面来编写监听“menu”和“back”键按下动作的代码。按下“back”键要处理的任务有如下两个。
如果选项菜单已经d出,关闭选项菜单。如果选项菜单未d出,或已经被关闭,直接关闭当前的Activity,也就是调用finish方法。为了区分上面两个任务,在程序中设置了一个int类型状态变量(state),当state为1时表示选项菜单已d出,state为2时表示选项菜单未d出。下面我们看一下完整的实现代码。
复制代码 代码如下:
package mobile.androID.ch06.custom.menu;
import androID.app.Activity;
import androID.os.Bundle;
import androID.vIEw.Gravity;
import androID.vIEw.KeyEvent;
import androID.vIEw.VIEw;
import androID.vIEw.VIEw.OnClickListener;
import androID.Widget.PopupWindow;
import androID.Widget.Toast;
public class Main extends Activity
{
privatePopupWindow pop;
privateVIEw layout;
private int state = 2; //状态变量,1:选项菜单已d出,2:选项菜单未d出
@OverrIDe
publicvoID onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentVIEw(R.layout.main);
}
@OverrIDe
publicboolean onKeyDown(int keyCode,KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_MENU: // 按下“menu”键的动作
// 选项菜单已d出,不再d出新的窗口
if (state == 1)
return false;
// 装载选项菜单布局文件
layout =getLayoutInflater().inflate(R.layout.menu_layout,null);
// 创建PopupWindow对象,并在指定位置d出用于显示菜单的窗口
pop = new PopupWindow(layout,getwindowManager()
.getDefaultdisplay().getWIDth(),getwindowManager()
.getDefaultdisplay().getHeight());
// 设置d出窗口的位置
pop.showAtLocation(layout,Gravity.BottOM,0);
VIEw home = layout.findVIEwByID(R.ID.home);
// 为“首页”菜单项添加单击事件
home.setonClickListener(new OnClickListener()
{
@OverrIDe
public voID onClick(VIEw vIEw)
{
Toast.makeText(Main.this,"单击定制菜单.",Toast.LENGTH_LONG).show();
// 单击“首页”菜单项后,关闭选项菜单
pop.dismiss();
// 重新设置状态变量
state = 2;
}
});
// d出选项菜单后,将状态变量设为1,表示选项菜单已d出
state = 1;
return false;
case KeyEvent.KEYCODE_BACK: // 按下“back”键的动作
if (state == 1)
{
// 如果选项菜单已d出,关闭它
pop.dismiss();
// 将状态变量设为选项菜单已关闭
state = 2;
}
else if (state == 2)
{
// 如果选项菜单还没有显示,或已经关闭,则直接关闭当前的Activity
finish();
}
return false;
}
// 除“menu”和“back”按下事件外,仍需调用Activity类的onKeyDown方法来响应其他键的按下事件
return super.onKeyDown(keyCode,event);
}
}
在编写上面代码时应注意如下几点。
以上是内存溢出为你收集整理的Android开发技巧之我的菜单我做主(自定义菜单)全部内容,希望文章能够帮你解决Android开发技巧之我的菜单我做主(自定义菜单)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)