虽然两种方法有很多相似的地方,但是使用的方法不同,废话不多说,帖方法了
方法一
功能简述
要实现能代替系统菜单的自定义菜单必须保证以下基本功能的实现:
能通过MENU键隐藏显示菜单(截获系统MENU键动态隐藏显示)
当获得焦点时高亮显示获得焦点的菜单项
实现按下菜单状态效果
能设置菜单背景
能设置菜单项背景
能设置菜单项图标(icon)
最后当然是最主要的事件处理
详细实现
1).定义菜单布局文件
1).首先定义advancedbutton.xml,来实现菜单项焦点获得高亮显示、按下的效果
<item android:state_focused="true" android:state_pressed="false"
android:drawable="@drawable/anniutrue" /><!-- 焦点在时,但没有按下 -->
<item android:state_focused="true" android:state_pressed="true"
android:drawable="@drawable/anniufocus" /><!-- 焦点在时,并按下了按钮 -->
<item android:state_focused="false" android:state_pressed="true"
android:drawable="@drawable/anniutrue" /><!-- 焦点不在时,按下了按钮(主要指触摸按下的时候) -->
<item android:drawable="@drawable/anniufalse" /><!-- 普通状态 -->
2).实现菜单布局文件
<LinearLayout android:id="@+id/menu" android:visibility="gone"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/menuimg" android:paddingTop="2dip"
android:paddingBottom="2dip">
<Button android:id="@+id/ibtn_his"
android:background="@drawable/advancedbutton"
android:layout_width="0dip" android:layout_weight="0.25"
android:layout_height="wrap_content"
android:text ="@string/ButtonHistory"
android:drawableTop="@drawable/lishihangxian"
android:textColor="@drawable/white"
android:layout_margin="4dip"/>
<Button android:id="@+id/ibtn_pricemap"
android:background="@drawable/advancedbutton"
android:layout_width="0dip" android:layout_weight="0.25"
android:layout_height="wrap_content"
android:text ="@string/ButtonPrice"
android:drawableTop="@drawable/jiagequshi"
android:textColor="@drawable/white"
android:layout_margin="4dip"/>
<Button android:id="@+id/ibtn_sale"
android:background="@drawable/advancedbutton"
android:layout_width="0dip" android:layout_weight="0.25"
android:layout_height="wrap_content"
android:text ="@string/ButtonSale"
android:drawableTop="@drawable/tejiajipiao"
android:textColor="@drawable/white"
android:layout_margin="4dip"/>
<Button android:id="@+id/ibtn_help"
android:background="@drawable/advancedbutton"
android:layout_width="0dip" android:layout_weight="0.25"
android:layout_height="wrap_content"
android:text ="@string/main_menu_help"
android:drawableTop="@drawable/bangzhu"
android:textColor="@drawable/white"
android:layout_margin="4dip"/>
</LinearLayout>
3).定义静态方法——用于隐藏/显示传过来的菜单
public static void setMenuEvent(LinearLayout layout) {
if(layout.getVisibility() == android.view.View.GONE) {
layout.setVisibility(android.view.View.VISIBLE);
}else{
layout.setVisibility(android.view.View.GONE);
}
}
4).重载Activity类的onKeyUp()或onKeyDown按键事件监听MENU键实现菜单的隐藏/显示
@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);
// for (int i = 0; i < ll.getChildCount(); i++) {
// Button menu = (Button) ll.getChildAt(i);
// isShowMenu = Method.setMenuEvent(ll, isShowMenu);
Method.setMenuEvent(menu);
// if (!isShowMenu) {
// ll.setVisibility(View.VISIBLE);
// menu.setVisibility(View.VISIBLE);
// } else {
// ll.setVisibility(View.GONE);
// menu.setVisibility(View.INVISIBLE);
}
// }
// isShowMenu = !isShowMenu;
return super.onKeyUp(keyCode, event);
}
然后获取Layout里的Button(菜单项)添加事件监听,实现菜单项事件处理。
至此以上提出的菜单最基本的7要素便已完成。
下篇文章我将在这基础上修改完善,使它能实现动态菜单项的添加删除。
方法二
首先,写出自己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"
androidrientation="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就可以运行了。
方法一
功能简述
要实现能代替系统菜单的自定义菜单必须保证以下基本功能的实现:
能通过MENU键隐藏显示菜单(截获系统MENU键动态隐藏显示)
当获得焦点时高亮显示获得焦点的菜单项
实现按下菜单状态效果
能设置菜单背景
能设置菜单项背景
能设置菜单项图标(icon)
最后当然是最主要的事件处理
详细实现
1).定义菜单布局文件
1).首先定义advancedbutton.xml,来实现菜单项焦点获得高亮显示、按下的效果
<item android:state_focused="true" android:state_pressed="false"
android:drawable="@drawable/anniutrue" /><!-- 焦点在时,但没有按下 -->
<item android:state_focused="true" android:state_pressed="true"
android:drawable="@drawable/anniufocus" /><!-- 焦点在时,并按下了按钮 -->
<item android:state_focused="false" android:state_pressed="true"
android:drawable="@drawable/anniutrue" /><!-- 焦点不在时,按下了按钮(主要指触摸按下的时候) -->
<item android:drawable="@drawable/anniufalse" /><!-- 普通状态 -->
2).实现菜单布局文件
<LinearLayout android:id="@+id/menu" android:visibility="gone"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/menuimg" android:paddingTop="2dip"
android:paddingBottom="2dip">
<Button android:id="@+id/ibtn_his"
android:background="@drawable/advancedbutton"
android:layout_width="0dip" android:layout_weight="0.25"
android:layout_height="wrap_content"
android:text ="@string/ButtonHistory"
android:drawableTop="@drawable/lishihangxian"
android:textColor="@drawable/white"
android:layout_margin="4dip"/>
<Button android:id="@+id/ibtn_pricemap"
android:background="@drawable/advancedbutton"
android:layout_width="0dip" android:layout_weight="0.25"
android:layout_height="wrap_content"
android:text ="@string/ButtonPrice"
android:drawableTop="@drawable/jiagequshi"
android:textColor="@drawable/white"
android:layout_margin="4dip"/>
<Button android:id="@+id/ibtn_sale"
android:background="@drawable/advancedbutton"
android:layout_width="0dip" android:layout_weight="0.25"
android:layout_height="wrap_content"
android:text ="@string/ButtonSale"
android:drawableTop="@drawable/tejiajipiao"
android:textColor="@drawable/white"
android:layout_margin="4dip"/>
<Button android:id="@+id/ibtn_help"
android:background="@drawable/advancedbutton"
android:layout_width="0dip" android:layout_weight="0.25"
android:layout_height="wrap_content"
android:text ="@string/main_menu_help"
android:drawableTop="@drawable/bangzhu"
android:textColor="@drawable/white"
android:layout_margin="4dip"/>
</LinearLayout>
3).定义静态方法——用于隐藏/显示传过来的菜单
public static void setMenuEvent(LinearLayout layout) {
if(layout.getVisibility() == android.view.View.GONE) {
layout.setVisibility(android.view.View.VISIBLE);
}else{
layout.setVisibility(android.view.View.GONE);
}
}
4).重载Activity类的onKeyUp()或onKeyDown按键事件监听MENU键实现菜单的隐藏/显示
@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);
// for (int i = 0; i < ll.getChildCount(); i++) {
// Button menu = (Button) ll.getChildAt(i);
// isShowMenu = Method.setMenuEvent(ll, isShowMenu);
Method.setMenuEvent(menu);
// if (!isShowMenu) {
// ll.setVisibility(View.VISIBLE);
// menu.setVisibility(View.VISIBLE);
// } else {
// ll.setVisibility(View.GONE);
// menu.setVisibility(View.INVISIBLE);
}
// }
// isShowMenu = !isShowMenu;
return super.onKeyUp(keyCode, event);
}
然后获取Layout里的Button(菜单项)添加事件监听,实现菜单项事件处理。
至此以上提出的菜单最基本的7要素便已完成。
下篇文章我将在这基础上修改完善,使它能实现动态菜单项的添加删除。
方法二
首先,写出自己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"
androidrientation="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就可以运行了。