Android自定义Menu(菜单)
2016-08-03 00:00
155 查看
摘要: 张亚龙,于2012-8-13在OSchina发表,现在换账号,重新发表
先看看自定义Menu效果图:
新建自定义Menu————>TabMenu.java如下:
package com.ncw; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.AdapterView.OnItemClickListener; import android.widget.LinearLayout.LayoutParams; public class TabMenu extends PopupWindow { private GridView gridView; private LinearLayout mLayout; public TabMenu(Context context, OnItemClickListener bodyClick, int colorBgTabMenu) { super(context); mLayout = new LinearLayout(context); mLayout.setOrientation(LinearLayout.VERTICAL); gridView = new GridView(context); gridView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));// 选中的时候为透明色 gridView.setNumColumns(4); gridView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); gridView.setVerticalSpacing(0); gridView.setHorizontalSpacing(0); gridView.setPadding(0, 0, 0, 0); gridView.setGravity(Gravity.CENTER); gridView.setOnItemClickListener(bodyClick); mLayout.addView(gridView); // 设置默认项 this.setContentView(mLayout); this.setWidth(LayoutParams.FILL_PARENT); this.setHeight(LayoutParams.WRAP_CONTENT); this.setBackgroundDrawable(new ColorDrawable(colorBgTabMenu));// 设置TabMenu菜单背景 this.setFocusable(true);// menu菜单获得焦点 如果没有获得焦点menu菜单中的控件事件无法响应 } public void SetBodySelect(int index, int colorSelBody) { int count = gridView.getChildCount(); for (int i = 0; i < count; i++) { if (i != index) ((LinearLayout) gridView.getChildAt(i)) .setBackgroundColor(Color.TRANSPARENT); } ((LinearLayout) gridView.getChildAt(index)) .setBackgroundColor(colorSelBody); } public void SetBodyAdapter(MenuBodyAdapter bodyAdapter) { gridView.setAdapter(bodyAdapter); } /** * 自定义Adapter,TabMenu的每个分页的主体 * */ static public class MenuBodyAdapter extends BaseAdapter { private Context mContext; private int[] resID; /** * 设置TabMenu的分页主体 * * @param context * 调用方的上下文 * @param resID */ public MenuBodyAdapter(Context context, int[] resID) { this.mContext = context; this.resID = resID; } @Override public int getCount() { return resID.length; } public Object getItem(int position) { return makeMenyBody(position); } public long getItemId(int position) { return position; } private LinearLayout makeMenyBody(int position) { LinearLayout result = new LinearLayout(this.mContext); result.setOrientation(LinearLayout.VERTICAL); result.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL); result.setPadding(0, 0, 0, 0); ImageView img = new ImageView(this.mContext); img.setBackgroundResource(resID[position]); result.addView(img, new LinearLayout.LayoutParams(new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT))); return result; } public View getView(int position, View convertView, ViewGroup parent) { return makeMenyBody(position); } } }
使用自定义Menu————>testTabMenu.java
package com.ncw; import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; public class testTabMenu extends Activity { TabMenu.MenuBodyAdapter bodyAdapter = new TabMenu.MenuBodyAdapter(this, new int[] { R.drawable.menu_01, R.drawable.menu_02, R.drawable.menu_03, R.drawable.menu_04 }); TabMenu tabMenu; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tabMenu = new TabMenu(this, new BodyClickEvent(), R.drawable.menu_bg);// 出现与消失的动画 tabMenu.update(); tabMenu.SetBodyAdapter(bodyAdapter); } class BodyClickEvent implements OnItemClickListener { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { tabMenu.SetBodySelect(arg2, Color.GRAY); Log.i("Log", " BodyClickEvent implements OnItemClickListener " + arg2); } } @Override /** * 创建MENU */ public boolean onCreateOptionsMenu(Menu menu) { menu.add("menu");// 必须创建一项 return super.onCreateOptionsMenu(menu); } @Override /** * 拦截MENU */ public boolean onMenuOpened(int featureId, Menu menu) { if (tabMenu != null) { if (tabMenu.isShowing()) tabMenu.dismiss(); else { tabMenu.showAtLocation(findViewById(R.id.LinearLayout01), Gravity.BOTTOM, 0, 0); } } return false;// 返回为true 则显示系统menu } }
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/LinearLayout01" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/TextView01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="自定义Menu————张亚龙" > </TextView> </LinearLayout>
相关文章推荐
- Android(OPhone) 学习笔记 - 菜单使用
- android简单demo学习系例之菜单实现
- Android 在XML中定义菜单
- Android高手进阶教程(六)之 ----Android 中MenuInflater的使用(布局定义菜单)
- Android开发基础:创建菜单Menu
- android之布局(Layout)和菜单(Menu)
- android_菜单(Menu)的使用
- Android中动态添加╱删除的Spinner菜单 — ArrayList与Widget的依赖性
- Android菜单
- 创建androidMenu菜单
- Android基础教程(五)之-----Menu功能菜单设计
- 系出名门Android(2) - 布局(Layout)和菜单(Menu)
- Android中动态添加╱删除的Spinner菜单
- Android基础教程(五)之-----Menu功能菜单设计
- Android学习——编写菜单
- android UI之菜单篇
- Android开发指南-用户界面-创建菜单
- Android高手进阶教程(六)之----Android 中MenuInflater的使用(布局定义菜单)!
- android之菜单实现
- Android开发基础:创建菜单Menu