实现界面如下:
onCreateOptionsMenu方法用于创建选项菜单,在显示选项菜单之前,系统会调用onMenuOpened方法,如果该方法返回false,则在onCreateOptionsMenu中创建的选项菜单将不会显示,因此,在onMenuOpened方法中弹出用于显示自定义菜单的窗口。
完整代码如下:
package cn.yh.menuopened;
import android.os.Bundle;
import android.app.Activity;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnKeyListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.PopupWindow;
import android.widget.Toast;
public class MainActivity extends Activity implements OnKeyListener,
OnItemClickListener {
private PopupWindow popupWindow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在弹出窗口中显示的GridView对象
GridView gvPopupWindow = (GridView) getLayoutInflater().inflate(
R.layout.popup_window, null);
//gridAdapter向GridView对象提供数据
GridAdapter gridAdapter = new GridAdapter(this);
gvPopupWindow.setAdapter(gridAdapter);
gvPopupWindow.setOnKeyListener(this);
gvPopupWindow.setOnItemClickListener(this);
/**
* public PopupWindow(View contentView, int width, int height)
*/
popupWindow = new PopupWindow(gvPopupWindow, LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT);
popupWindow.setFocusable(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// getMenuInflater().inflate(R.menu.main, menu);
menu.add("menu");
return super.onCreateOptionsMenu(menu);
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int poistion,
long arg3) {
// TODO Auto-generated method stub
popupWindow.dismiss();
Toast.makeText(this, Const.GRID_ITEM_TEXT_LIST[poistion],
Toast.LENGTH_LONG).show();
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
if(popupWindow.isShowing()){
popupWindow.dismiss();
}
break;
default:
break;
}
return false;
}
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
// TODO Auto-generated method stub
if(popupWindow != null){
if(popupWindow.isShowing()){
popupWindow.dismiss();
}
else{
View layout = getLayoutInflater().inflate(R.layout.activity_main, null);
/**
* public void showAtLocation(View parent, int gravity, int x, int y)
*/
popupWindow.showAtLocation(layout, Gravity.CENTER, 0, 0);
}
}
/**
* 返回false,所以在onCreateOptionsMenu中添加的选项菜单不会显示
*/
return false;
}
}
提供数据的GridAdapter:
package cn.yh.menuopened;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class GridAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater mLayoutInflater;
public GridAdapter(Context mContext) {
this.mContext = mContext;
this.mLayoutInflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return Const.GRID_ICON_ID_LIST.length;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if (convertView == null)
convertView = mLayoutInflater.inflate(R.layout.grid_item, null);
ImageView ivGridItemIcon = (ImageView) convertView.findViewById(R.id.ivGridItemIcon);
TextView tvGridItemText = (TextView) convertView.findViewById(R.id.tvGridItemText);
ivGridItemIcon.setImageResource(Const.GRID_ICON_ID_LIST[position]);
tvGridItemText.setText(Const.GRID_ITEM_TEXT_LIST[position]);
return convertView;
}
}
工具类Const:
package cn.yh.menuopened;
public class Const {
public final static int[] GRID_ICON_ID_LIST = new int[] { R.drawable.add,
R.drawable.browser, R.drawable.facebook, R.drawable.google,
R.drawable.simile, R.drawable.voice, R.drawable.write,
R.drawable.yahoo, R.drawable.youtube };
public final static String[] GRID_ITEM_TEXT_LIST = new String[] { "添加",
"浏览器", "Facebook", "Google", "笑脸", "Voice", "书写", "雅虎", "YouTube" };
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/gvPopupWindow"
android:padding="10dp"
android:gravity="center"
android:horizontalSpacing="10dp"
android:verticalSpacing="10dp"
android:stretchMode="columnWidth"
android:columnWidth="80dp"
android:numColumns="auto_fit" >
</GridView>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<ImageView android:layout_width="50dp"
android:layout_height="50dp"
android:id="@+id/ivGridItemIcon"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvGridItemText"
android:textColor="#ccefde"/>
</LinearLayout>