[Android实例] 教你自定义menu,将系统menu替换之 [复制链接] zguanyu No.2 优亿初级开发者 精华 0 帖子 30 e币 80 元 串个门 加好友 打招呼 发消息 电梯直达 楼主 发表于 2010-8-12 11:35:12 | 只看该作者 | 倒序浏览 应trace版主之邀请,写一篇关于自定义menu的帖子,废话不说了,直接看下面。 首先,写出自己menu的layout: <?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/menu" android:visibility="visible" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#191919" android:paddingTop="2dip" android:paddingBottom="2dip" > <Button android:id="@+id/menu_add" android:background="#191919" android:layout_width="0dip" android:layout_weight="0.25" android:layout_height="wrap_content" android:text ="add" android:textColor="#FFFFFF" android:drawableTop="@drawable/option_add_icon_selector" android:layout_margin="4dip"/> <Button android:id="@+id/menu_synchronize" android:background="#191919" android:layout_width="0dip" android:layout_weight="0.25" android:layout_height="wrap_content" android:text ="synchronize" android:textColor="#FFFFFF" android:drawableTop="@drawable/option_synchronize_icon_selector" android:layout_margin="4dip"/> <Button android:id="@+id/menu_setting" android:background="#191919" android:layout_width="0dip" android:layout_weight="0.25" android:layout_height="wrap_content" android:text ="setting" android:textColor="#FFFFFF" android:drawableTop="@drawable/option_setting_icon_selector" android:layout_margin="4dip"/> <Button android:id="@+id/menu_exit" android:background="#191919" android:layout_width="0dip" android:layout_weight="0.25" android:layout_height="wrap_content" android:text ="exit" android:textColor="#FFFFFF" android:drawableTop="@drawable/option_exit_icon_selector" android:layout_margin="4dip"/> </LinearLayout> 其中android:drawableTop的值是自己定义的一个selector,这个就自己看着办了,很简单。 然后要定义一个类,继承自LinearLayout: public class MyLinearLayout extends LinearLayout { private Context context; private Button add; private Button setting; private Button synchronize; private Button exit; public MyLinearLayout(Context context) { super(context); this.context = context; setView(); // TODO Auto-generated constructor stub } public MyLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; setView(); // TODO Auto-generated constructor stub } private void setView() { setTag(MyLinearLayout.class); LayoutInflater mInflate = LayoutInflater.from(context); final View menu = mInflate.inflate(R.layout.linearlayout, null); menu.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT,100)); addView(menu); 你也发现了,是和xml文件定义一致的,即用这个类来解析和控制menu,以前menu中的每个Item就是现在的一个Button,可以在Button上添加Listener完成相应的功能。 接下里就是要把menu加入main.xml中: <com.test.MyLinearLayout android:id="@+id/linearlayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true"/> 将上述代码加入main.xml中,要注意的是一定要保证你的main.xml最外层是RelativeLayout,这样可以控制你的menu在屏幕中的位置如:android:layout_alignParentBottom="true"/且不会挤压其他控件。 接着就是要控制menu怎么显示和隐藏了,在主Activity里,定义一个LinearLayout实例linearLayout = (LinearLayout) findViewById(R.id.linearlayout),且linearLayout.setVisibility(android.view.View.GONE),增加一个方法: public static void setMenuEvent(LinearLayout layout) { if(layout.getVisibility() == android.view.View.GONE) { layout.setVisibility(android.view.View.VISIBLE); Log.d("menu", "!!!!!!I am here Nothidden"); }else{ layout.setVisibility(android.view.View.GONE); Log.d("menu", "!!!!!!I am here hidden"); } } 重写一个方法: @Override public boolean onKeyUp(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_MENU) { // LinearLayout menu = (LinearLayout)findViewById(R.id.menu); // LinearLayout l = new LinearLayout(this); // l.setVisibility(android.view.View.GONE); setMenuEvent(linearLayout); } return super.onKeyUp(keyCode, event); } Ok了,现在build project就可以运行了。