android 自定义menu菜单样式

本文介绍了如何在Android系统中自定义menu菜单样式,通过CustomActivity.java实现对话框的个性化,定义回调函数OnItemClick.java,并提供了测试类test.java,以及gridview_menu.xml和item_menu.xml两个布局文件作为示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android系统中的menu样式不是太好,可以自定义。运行效果

CustomActivity.java继承Activity.java 在此文件中实现了不同于系统的dialog

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.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import android.widget.SimpleAdapter.ViewBinder;

public  class CustomActivity extends Activity{
	 
	 AlertDialog menuDialog; 
	 GridView menuGrid;    
	 View menuView;
	 OnItemClick  OnItemClickListener;
	 private int size=0;
	 private Menu menu;
	 
	 public void setOnItemClickListener(final OnItemClick listener){
		 this.OnItemClickListener = listener;
	 }
	 
	 @Override
	 protected void onCreate(Bundle savedInstanceState) {
		 super.onCreate(savedInstanceState);
		 menuView = View.inflate(this, R.layout.gridview_menu, null);
	       
		 menuDialog = new AlertDialog.Builder(this).create();        
		 menuDialog.setView(menuView);        
		 menuDialog.setOnKeyListener(new OnKeyListener() { 
			 @Override
			 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.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position,
					long id) {
				// TODO Auto-generated method stub
				OnItemClickListener.onItemClick(view,position,getItemId(id));
				 menuGrid.invalidate();
			}
		});
	 }
     public long getItemId(long id){
    	 if(menu!=null && id<size){
    		 return (long)(menu.getItem((int)id).getItemId());
    	 }
    	 return -1;
     }
	 @Override    
	 public boolean onCreateOptionsMenu(Menu menu) {        
		 //menu.add("menu");// 必须创建一项        
		 this.menu = menu;
		 menuGrid.setAdapter(getMenuAdapter(menu));
		 return super.onCreateOptionsMenu(menu);    
	}
	 private SimpleAdapter getMenuAdapter(Menu menu){
	    	size = menu.size();
	    	ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
	    	for (int i = 0; i < size; i++){
	    		 Log.i("","menuItemID:"+menu.getItem(i).getItemId()+",i:"+i);
	    		Drawable icon=menu.getItem(i).getIcon();	 
	    		String text = menu.getItem(i).getTitle().toString();
	    		if(icon==null)
	    			icon = getResources().getDrawable(android.R.drawable.ic_menu_help);
	    		
	    		HashMap<String, Object> map = new HashMap<String, Object>();
	    		map.put("itemImage", icon);            
	    		map.put("itemText", text);            
	    		data.add(map);
	    	} 
	    	SimpleAdapter Adapter = new SimpleAdapter(this, data,                
	    			R.layout.item_menu, new String[] { "itemImage", "itemText" },                
	    			new int[] { R.id.item_image, R.id.item_text }); 
	    	Adapter.setViewBinder(new  ViewBinder(){
				@Override
				public boolean setViewValue(View view, Object data, String arg2) {
					// TODO Auto-generated method stub
					 if(view instanceof ImageView && data instanceof Drawable){
		                    ImageView iv=(ImageView)view;
		                    iv.setImageDrawable((Drawable)data);
		                    return true;
		                }
					return false;
				}
	    	});
	    	return Adapter;
	    }
	 @Override    
	 public boolean onMenuOpened(int featureId, Menu menu) {
		 if(size>0){
		 if (menuDialog == null) {            
			 menuDialog = new AlertDialog.Builder(this).setView(menuView).show();        
			 } else {            
			menuDialog.show();        
			}    
		 }
		 return false;// 返回为true 则显示系统menu 
	 }
}

定义回调函数类OnItemClick.java

import android.view.View;

public abstract interface OnItemClick{
	 public  abstract void onItemClick( View view, int position, long MenuItemId);
}

 

测试类test.java

import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;


public class test extends CustomActivity implements OnItemClick{

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       this.setOnItemClickListener(this);//此处设置点击事件回调onItemClick
        //setContentView(R.layout.activity_main);
      }

 @Override
     public boolean onCreateOptionsMenu(Menu menu) {
   
         menu.add(Menu.NONE, Menu.FIRST + 1, 0, "删除").setIcon(
         android.R.drawable.ic_menu_delete);

         menu.add(Menu.NONE, Menu.FIRST + 2, 0, "保存").setIcon(
         android.R.drawable.ic_menu_edit);

         menu.add(Menu.NONE, Menu.FIRST + 3, 0, "帮助").setIcon(
         android.R.drawable.ic_menu_help);

         menu.add(Menu.NONE, Menu.FIRST + 4, 0, "添加").setIcon(
         android.R.drawable.ic_menu_add);

         menu.add(Menu.NONE, Menu.FIRST + 5, 0, "详细").setIcon(
         android.R.drawable.ic_menu_info_details);

         menu.add(Menu.NONE, Menu.FIRST + 6, 0, "发送").setIcon(
         android.R.drawable.ic_menu_send);
         
         menu.add(Menu.NONE, Menu.FIRST + 7, 0, "发送");
         menu.add(Menu.NONE, Menu.FIRST + 8, 0, "");
  //MenuInflater menuInflater = new MenuInflater(getApplication());  
  //menuInflater.inflate(R.menu.main, menu);  

         return super.onCreateOptionsMenu(menu);

     }

 @Override
 public void onItemClick(View view, int position, long id) {//pasition表示在dialog中的位置,从0开始。id表示menu的id,如用代码添加的                                                                   //Menu.FIRST+7、xml添加中的R.id.menu
  // TODO Auto-generated method stub
  Log.i("","position:"+position+",id:"+id);
  
 }

}

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"
    android:background="#000000"
    >
<GridView
         android:id="@+id/gridview"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:numColumns="3"
         android:verticalSpacing="20dip"
         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">
    </TextView>
</RelativeLayout>






 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值