android中的控件都具有很好的扩展性,这里的PopupWindow中可以放置自定义的view,用法简单而方便。
public class MainActivity extends Activity { static final String TAG = "MainActivity"; private List<Map<String, String>> list = new ArrayList<Map<String, String>>(); private int state, state1; private Button button, button1; private ListView menulist; private View layout; private PopupWindow pop, pop1; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 初始化数据List initPopListData(); button = (Button)findViewById(R.id.button); button1 = (Button)findViewById(R.id.button1); button.setOnClickListener(listener); button1.setOnClickListener(listener); } private OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { if ( v.getId() == R.id.button ) { if (state == 1 && pop.isShowing()) { state = 0; pop.dismiss(); } else { // 放置自定义的view layout = MainActivity.this.getLayoutInflater() .inflate(R.layout.pop, null); menulist = (ListView) layout.findViewById(R.id.menulist); SimpleAdapter listAdapter = new SimpleAdapter( MainActivity.this, list, R.layout.menu_item, new String[] { "menuItemName" }, new int[] { R.id.menuitem }); menulist.setAdapter(listAdapter); /** * layout PopupWindow所显示的界面 * myButton.getWidth() 设置PopupWindow宽度 * myButton.getHeight() * 3 + 5 设置PopupWindow宽度高度 */ pop = new PopupWindow( layout, button.getWidth(), button.getHeight() * 3 + 5); // 设置背景 ColorDrawable cd = new ColorDrawable(-0000); pop.setBackgroundDrawable(cd); pop.update(); pop.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); pop.setTouchable(true); // 设置popupwindow可点击 pop.setOutsideTouchable(true); // 设置popupwindow外部可点击 pop.setFocusable(true); //获取焦点 /*设置popupwindow的位置*/ pop.showAtLocation(layout, (Gravity.BOTTOM - button.getHeight()) | Gravity.LEFT, 0, 2 * button.getHeight()); state = 1; pop.setTouchInterceptor(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { /* * 如果点击了popupwindow的外部,popupwindow也会消失. * 这是PopupWindow的重要特性 */ if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { pop.dismiss(); return true; } return false; } }); // 点击listview中item的处理 menulist.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { switch (arg2) { case 0: Toast.makeText(getApplicationContext(), "系统设置", Toast.LENGTH_SHORT).show(); pop.dismiss(); break; case 1: Toast.makeText(getApplicationContext(), "自动更新", Toast.LENGTH_SHORT).show(); pop.dismiss(); break; case 2: Toast.makeText(getApplicationContext(), "关于", Toast.LENGTH_SHORT).show(); pop.dismiss(); break; case 3: Toast.makeText(getApplicationContext(), "搜索", Toast.LENGTH_SHORT).show(); pop.dismiss(); break; case 4: Toast.makeText(getApplicationContext(), "退出", Toast.LENGTH_SHORT).show(); pop.dismiss(); break; } } }); } } else if ( v.getId() == R.id.button1) { if (state1 == 1 && pop1.isShowing()) { state1 = 0; pop1.dismiss(); } else { layout = getLayoutInflater().inflate(R.layout.pop1, null); ((ImageView)layout.findViewById(R.id.image)) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "image", Toast.LENGTH_SHORT).show(); pop1.dismiss(); } }); ((ImageView)layout.findViewById(R.id.image1)) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "image1", Toast.LENGTH_SHORT).show(); pop1.dismiss(); } }); pop1 = new PopupWindow(layout, 150, 80); ColorDrawable cd = new ColorDrawable(Color.RED); pop1.setBackgroundDrawable(cd); pop1.update(); pop1.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); pop1.setTouchable(true); pop1.setOutsideTouchable(true); pop1.setFocusable(true); pop1.showAtLocation(layout, (Gravity.BOTTOM - button.getHeight()) | Gravity.LEFT, 0, 2 * button.getHeight()); state1 = 1; pop1.setTouchInterceptor(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_OUTSIDE) { pop1.dismiss(); return true; } return false; } }); } } } }; private void initPopListData() { HashMap<String, String> map = new HashMap<String, String>(); map.put("menuItemName", "系统设置"); list.add(map); map = new HashMap<String, String>(); map.put("menuItemName", "自助更新"); list.add(map); map = new HashMap<String, String>(); map.put("menuItemName", "关于"); list.add(map); map = new HashMap<String, String>(); map.put("menuItemName", "搜索"); list.add(map); map = new HashMap<String, String>(); map.put("menuItemName", "退出"); list.add(map); } }