ActivityGroup基本菜单的实现和弹出菜单的实现

来源:互联网 发布:潍坊行知2016升学率 编辑:程序博客网 时间:2024/06/01 09:42

之前用TabHost实现过基本菜单的功能,但是操作使用困难,现在最多使用的是ActivityGroup和GridView相结合的方式完成;使用ActivityGroup可以让多个Activity同时运行在一个屏幕上,而且每个Activity还能独立工作。

1、主程序的显示MainActivity

<pre name="code" class="java">package com.jackie.activitygroupproject;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.ActivityGroup;import android.app.AlertDialog;import android.app.Dialog;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Color;import android.graphics.drawable.ColorDrawable;import android.os.Bundle;import android.view.Gravity;import android.view.KeyEvent;import android.view.View;import android.view.ViewGroup.LayoutParams;import android.view.Window;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.GridView;import android.widget.LinearLayout;import android.widget.Toast;public class MainActivity extends ActivityGroup {private LinearLayout content = null; // 填充内容private MenuImageAdapter menu = null; // 图片适配器private GridView gridViewToolBar; // 工具菜单类private int[] menu_img = new int[] { R.drawable.pic_1, R.drawable.pic_2,R.drawable.pic_3, R.drawable.pic_4, R.drawable.pic_5 }; // 填充的图片资源private int width = 0; // 求出平均的宽度private int height = 0; // 求出平均的高度private Intent intent;private PopupMenuBodyAdapter commonAdapter = null;private PopupMenuBodyAdapter setAdapter = null;private PopupMenuBodyAdapter toolAdapter = null;private boolean isShow = false; // 默认更多菜单关闭private int commonItemIds[] = new int[] { R.drawable.pic_1,R.drawable.pic_2, R.drawable.pic_3, R.drawable.pic_4,R.drawable.pic_5, R.drawable.pic_1, R.drawable.pic_2,R.drawable.pic_3, R.drawable.pic_4, R.drawable.pic_5 };private int setItemIds[] = new int[] { R.drawable.pic_4, R.drawable.pic_5,R.drawable.pic_1, R.drawable.pic_2, R.drawable.pic_3,R.drawable.pic_4, R.drawable.pic_5, R.drawable.pic_1,R.drawable.pic_2, R.drawable.pic_3 };private int toolItemIds[] = new int[] { R.drawable.pic_5, R.drawable.pic_1,R.drawable.pic_2, R.drawable.pic_3, R.drawable.pic_1,R.drawable.pic_2, R.drawable.pic_3, R.drawable.pic_4 };private PopupMenu popMenu = null;private int titleIds[] = new int[] { R.string.popmenu_common,R.string.popmenu_set, R.string.popmenu_tool };@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.requestWindowFeature(Window.FEATURE_NO_TITLE); // 取消标题super.setContentView(R.layout.activity_main);this.content = (LinearLayout) super.findViewById(R.id.content);this.gridViewToolBar = (GridView) super.findViewById(R.id.gridviewbar);// 定义一些工具栏的信息显示this.gridViewToolBar.setNumColumns(menu_img.length); // 求出一行可以保存的个数this.gridViewToolBar.setSelector(new ColorDrawable(Color.TRANSPARENT));this.gridViewToolBar.setGravity(Gravity.CENTER);this.gridViewToolBar.setVerticalSpacing(0);this.width = super.getWindowManager().getDefaultDisplay().getWidth()/ this.menu_img.length;this.height = super.getWindowManager().getDefaultDisplay().getHeight() / 8;this.menu = new MenuImageAdapter(this, this.menu_img, this.width,this.height, R.drawable.pic);this.gridViewToolBar.setAdapter(menu);this.switchActivity(0);this.gridViewToolBar.setOnItemClickListener(new OnItemClickListenerImpl());this.popMenu = new PopupMenu(this, titleIds, 0x55123456,new PopupTitleOnItemClickListenerCallback(),new PopupBodyOnItemClickListenerCallback());this.commonAdapter = new PopupMenuBodyAdapter(this, this.commonItemIds);this.setAdapter = new PopupMenuBodyAdapter(this, this.setItemIds);this.toolAdapter = new PopupMenuBodyAdapter(this, this.toolItemIds);this.popMenu.setPopupMenuBodyAdapter(commonAdapter);this.popMenu.setPopTitleSelected(0);}/* * private void initAdapter(){ Field[] * fields=R.drawable.class.getDeclaredFields();//取得全部属性 for(int * x=0;x<fields.length;x++){ Map<String,Integer> map=new * HashMap<String,Integer>(); if(fields[x].getName().startsWith("common_")){ * try { map.put("commonItem", fields[x].getInt(R.drawable.class)); } catch * (Exception e) { e.printStackTrace(); } this.list1.add(map); }else * if(fields[x].getName().startsWith("set_")){ try { map.put("setItem", * fields[x].getInt(R.drawable.class)); } catch (Exception e) { * e.printStackTrace(); } this.list2.add(map); }else * if(fields[x].getName().startsWith("tool_")){ try { map.put("toolItem", * fields[x].getInt(R.drawable.class)); } catch (Exception e) { * e.printStackTrace(); } this.list3.add(map); } } this.commonAdapter=new * PopupMenuBodyAdapter(this,null); } */public class OnItemClickListenerImpl implements OnItemClickListener {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {MainActivity.this.switchActivity(position);}}private void switchActivity(int id) { // 切换选中的操作this.menu.setFocus(id); // 设置选中图片的背景this.content.removeAllViews(); // 删除所有内容switch (id) {case 0:this.intent = new Intent(MainActivity.this, MyActivity.class);break;case 1:this.intent = new Intent(MainActivity.this, MyActivity.class);break;case 2:this.intent = new Intent(MainActivity.this, MyActivity.class);break;case 3:this.showPopupMenu();break;case 4:this.exitDialog();break;}this.intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);Window subActivity = super.getLocalActivityManager().startActivity("subActivity", this.intent);this.content.addView(subActivity.getDecorView(),LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);}private void exitDialog() {Dialog dialog = new AlertDialog.Builder(this).setIcon(R.drawable.file).setTitle("程序退出?").setMessage("您确定要退出本程序吗?").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {MainActivity.this.finish();}}).setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface arg0, int arg1) {MainActivity.this.switchActivity(0);}}).create();dialog.show();}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {this.exitDialog();}return super.onKeyDown(keyCode, event);}private void showPopupMenu() {if (this.isShow) { // 已经显示了this.popMenu.dismiss();this.isShow = false;} else {this.popMenu.showAtLocation(MainActivity.this.gridViewToolBar,Gravity.BOTTOM, 0, this.height);this.isShow = true;}}public class PopupTitleOnItemClickListenerCallback implementsOnItemClickListener {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {MainActivity.this.popMenu.setPopTitleSelected(position);switch (position) {case 0:MainActivity.this.popMenu.setPopupMenuBodyAdapter(commonAdapter);break;case 1:MainActivity.this.popMenu.setPopupMenuBodyAdapter(setAdapter);break;case 2:MainActivity.this.popMenu.setPopupMenuBodyAdapter(toolAdapter);break;}}}public class PopupBodyOnItemClickListenerCallback implementsOnItemClickListener {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id) {MainActivity.this.popMenu.setPopBodySelected(position, Color.GRAY);Toast.makeText(MainActivity.this, "执行选项-" + position,Toast.LENGTH_LONG).show();}}}


2、切换菜单显示的MyActivity

package com.jackie.activitygroupproject;import android.os.Bundle;import android.app.Activity;import android.view.Menu;public class MyActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.setContentView(R.layout.mylayout);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}

3、自定义的适配器MenuImageAdapter  除了显示操作外,还需要做许多其他的额外功能

package com.jackie.activitygroupproject;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.ImageView;public class MenuImageAdapter extends BaseAdapter {private ImageView[] menuImg; // 保存所有要填充的组件private Context context = null; // 上下文对象private int selectedMenuImg; // 选中的索引public MenuImageAdapter(Context context, int imgIds[], int width,int height, int selectedMenuImg) {this.context = context;this.selectedMenuImg = selectedMenuImg;this.menuImg = new ImageView[imgIds.length]; // 开辟新数组for (int x = 0; x < imgIds.length; x++) {this.menuImg[x] = new ImageView(this.context); // 实例化ImageViewthis.menuImg[x].setLayoutParams(new GridView.LayoutParams(width,height)); // 设置图片的大小this.menuImg[x].setAdjustViewBounds(false); // 不调整边界显示this.menuImg[x].setPadding(3, 3, 3, 3); // 设置间距this.menuImg[x].setImageResource(imgIds[x]); // 设置显示的图片}}@Overridepublic int getCount() {return this.menuImg.length;}@Overridepublic Object getItem(int position) {return this.menuImg[position];}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ImageView imgView = null;if (convertView == null) {imgView = this.menuImg[position];} else {imgView = (ImageView) convertView;}return imgView;}public void setFocus(int selId) { // 设置选中显示for (int x = 0; x < menuImg.length; x++) {if (x != selId) { // 没有选中的this.menuImg[x].setBackgroundResource(0);     //不设置背景图片}}this.menuImg[selId].setBackgroundResource(selectedMenuImg);}}

4、弹出的窗口菜单popupMenu.java 定义标题和主体 都用gridView

package com.jackie.activitygroupproject;import android.content.Context;import android.graphics.Color;import android.graphics.drawable.ColorDrawable;import android.view.Gravity;import android.view.WindowManager.LayoutParams;import android.widget.AdapterView.OnItemClickListener;import android.widget.GridView;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.PopupWindow;public class PopupMenu extends PopupWindow {private GridView popTitle; // 表示标题private GridView popBody; // 表示主体private PopupMenuTitleAdapter titleAdapter = null;private LinearLayout layout = null;public PopupMenu(Context context, int[] titleIds, int backgroundColor,OnItemClickListener titleCallback, OnItemClickListener bodyCallback) {super(context); // 需要创建弹出的组件this.titleAdapter = new PopupMenuTitleAdapter(context, titleIds,0xFF222222, 16, Color.LTGRAY, Color.WHITE);this.layout = new LinearLayout(context);this.layout.setOrientation(LinearLayout.VERTICAL);this.popTitle = new GridView(context);this.popTitle.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));this.popTitle.setNumColumns(titleIds.length);this.popTitle.setHorizontalSpacing(1);this.popTitle.setVerticalSpacing(1);this.popTitle.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); // 设置拉伸列宽this.popTitle.setAdapter(this.titleAdapter);this.popTitle.setOnItemClickListener(titleCallback);this.popBody = new GridView(context);this.popBody.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));this.popBody.setNumColumns(5);this.popBody.setGravity(Gravity.CENTER);this.popBody.setPadding(10, 10, 10, 10);this.popBody.setHorizontalSpacing(1);this.popBody.setVerticalSpacing(1);this.popBody.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); // 设置拉伸列宽this.popBody.setOnItemClickListener(bodyCallback);this.layout.addView(popTitle);this.layout.addView(popBody);super.setContentView(this.layout);super.setHeight(LayoutParams.WRAP_CONTENT);super.setWidth(LayoutParams.MATCH_PARENT);super.setBackgroundDrawable(new ColorDrawable(backgroundColor));// 显示背景颜色操作super.setFocusable(true);// 允许获得焦点}public void setPopupMenuBodyAdapter(PopupMenuBodyAdapter adapter) {this.popBody.setAdapter(adapter);}public void setPopTitleSelected(int position) {this.popTitle.setSelection(position);this.titleAdapter.setFocus(position);}public void setPopBodySelected(int position, int selectedColor) { // 设置选中后的颜色int count = popBody.getChildCount();for (int x = 0; x < count; x++) {if (x != position) {ImageView img = (ImageView) this.popBody.getChildAt(x);img.setBackgroundColor(Color.TRANSPARENT);}}ImageView img = (ImageView) this.popBody.getChildAt(position);img.setBackgroundColor(selectedColor);}}

5、定义一个标题适配器PopupMenuTitleAdapter.java

package com.jackie.activitygroupproject;import android.content.Context;import android.graphics.drawable.ColorDrawable;import android.view.Gravity;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class PopupMenuTitleAdapter extends BaseAdapter {private TextView menuTitle[] = null; // 文字显示组件private int fontColor;private int selectedColor;private int unSelectedColor;public PopupMenuTitleAdapter(Context context, int[] titleIds,int fontColor, int fontSize, int selectedColor, int unSelectedColor) {this.fontColor = fontColor;this.selectedColor = selectedColor;this.unSelectedColor = unSelectedColor;this.menuTitle = new TextView[titleIds.length];for (int x = 0; x < titleIds.length; x++) {this.menuTitle[x] = new TextView(context);this.menuTitle[x].setText(titleIds[x]);this.menuTitle[x].setGravity(Gravity.CENTER);this.menuTitle[x].setTextSize(fontSize);this.menuTitle[x].setPadding(10, 10, 10, 10);}}@Overridepublic int getCount() {return this.menuTitle.length;}@Overridepublic Object getItem(int position) {return this.menuTitle[position];}@Overridepublic long getItemId(int position) {return this.menuTitle[position].getId();}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view = null;if (convertView == null) {view = this.menuTitle[position];} else {view = convertView;}return view;}public void setFocus(int index) {for (int x = 0; x < this.menuTitle.length; x++) {if (x != index) {this.menuTitle[x].setBackgroundDrawable(new ColorDrawable(this.unSelectedColor));this.menuTitle[x].setTextColor(fontColor);}}this.menuTitle[index].setBackgroundColor(0x00);this.menuTitle[index].setTextColor(this.selectedColor);}}

6、定义一个主体适配器 PopupMenuBodyAdapter.java

<pre name="code" class="java">package com.jackie.activitygroupproject;import java.util.List;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;public class PopupMenuBodyAdapter extends BaseAdapter {     private ImageView[] menuImg=null;          public PopupMenuBodyAdapter(Context context,int[] picIds){    this.menuImg=new ImageView[picIds.length];    for(int x=0;x<this.menuImg.length;x++){    this.menuImg[x]=new ImageView(context);    this.menuImg[x].setImageResource(picIds[x]);    }     }@Overridepublic int getCount() {return this.menuImg.length;}@Overridepublic Object getItem(int position) {return this.menuImg[position];}@Overridepublic long getItemId(int position) {return this.menuImg[position].getId();}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view=null;if(convertView==null){view=this.menuImg[position];}else{view=convertView;}return view;}}


7、两个Activity的布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context=".MainActivity" >    <RelativeLayout        android:layout_width="match_parent"        android:layout_height="match_parent" >        <LinearLayout            android:id="@+id/content"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:orientation="vertical" >        </LinearLayout>        <GridView            android:id="@+id/gridviewbar"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_alignParentBottom="true"            android:fadingEdge="vertical"            android:fadingEdgeLength="5sp" />    </RelativeLayout></LinearLayout>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <ImageView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/man"/>"</RelativeLayout>




0 0
原创粉丝点击