Android 自定义菜单示例

本文介绍了一种在Android应用中实现自定义菜单的方法。通过监听菜单键并使用PopupWindow显示菜单项,文中提供了详细的步骤说明及示例代码,展示了如何为菜单项添加点击事件。

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

Android 自定义菜单示例  

转自:http://huolangge.blog.163.com/blog/static/226510048201410995533991/
注:为什么我不直接在csdn上写博客,而是先在网易上写了再转载过来:
因为我是用为知笔记/wps记录实验过程的,写好之后直接就可以发到博客了,优快云 xxx的居然禁用第三方博客客户端,而复制到csdn的网页上,它不能识别图片,直接在网页上的时候又没有在本地那样快捷。但是毕竟技术文章发在csdn上比发在网易上有更多的人可以交流,所以才这么麻烦,真心希望csdn更够更人性化!!!!!

创建Android application project;
创建menu_layout.xml文件;注意必须在此文件中的根linearLayout下添加   android:gravity="bottom"     标签才能显示出来popwindow
   
   
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="wrap_content"
    5. android:gravity="bottom"
    6. android:orientation="horizontal" >
    7. <!-- 第一个菜单项:首页 上面是图片,下面是文字 -->
    8. <LinearLayout
    9. android:id="@+id/home"
    10. android:layout_width="match_parent"
    11. android:layout_height="wrap_content"
    12. android:orientation="vertical" >
    13. <ImageView
    14. android:layout_width="match_parent"
    15. android:layout_height="wrap_content"
    16. android:src="@drawable/home" />
    17. <TextView
    18. android:layout_width="match_parent"
    19. android:layout_height="wrap_content"
    20. android:text="首页" />
    21. </LinearLayout>
    22. <!-- 第二个菜单项:我的 左边是图片,右边是文字 -->
    23. <LinearLayout
    24. android:layout_width="match_parent"
    25. android:layout_height="match_parent"
    26. android:orientation="vertical" >
    27. </LinearLayout>
    28. <!-- 第一个菜单项:更多 上面是图片,下面是文字 -->
    29. <LinearLayout
    30. android:layout_width="match_parent"
    31. android:layout_height="match_parent"
    32. android:orientation="vertical" >
    33. </LinearLayout>
    34. </LinearLayout>

在主Activity类里监听“menu”按键的按下事件,然后动态装载menu_layout.xml文件;
   
   
    1. @Override
    2. public boolean onKeyDown(int keyCode, KeyEvent event) {
    3. switch (keyCode) {
    4. case KeyEvent.KEYCODE_MENU:// 按下“menu”按键的动作
    5. Log.d("tag", "菜单按钮按下");
    6. // 装载菜单布局文件,没有父窗口,所以第二个参数为null
    7. layout = getLayoutInflater().inflate(R.layout.menu_layout1, null);
    8. //创建PopupWindow对象,并指定其布局文件和其弹出的位置
    9. popwindow =new PopupWindow(layout,getWindowManager().getDefaultDisplay().getWidth(),getWindowManager().getDefaultDisplay().getHeight());
    10. //设置弹出窗口的位置
    11. popwindow.showAtLocation(layout, Gravity.BOTTOM, 0,0);
    12. return false;// 如果不返回true/false,则会继续执行super的方法
    13. case KeyEvent.KEYCODE_BACK:// 按下“back”按键的动作
    14. return false;// 如果不返回true/false,则会继续执行super的方法
    15. }
    16. // 必须调用此方法,以响应其他按键的按下事件
    17. return super.onKeyDown(keyCode, event);



显示效果如下:
Android 自定义菜单示例 - 到处玩的 - 到处玩的


初步完成雏形,进行优化 menu_layout.xml文件
   
   
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="wrap_content"
    5. android:gravity="bottom"
    6. android:orientation="horizontal" >
    7. <!-- 第一个菜单项:首页 上面是图片,下面是文字 -->
    8. <LinearLayout
    9. android:id="@+id/home"
    10. android:layout_width="fill_parent"
    11. android:layout_height="wrap_content"
    12. android:layout_weight="1"
    13. android:background="@drawable/button_normal_translucent"
    14. android:orientation="vertical" >
    15. <ImageView
    16. android:layout_width="fill_parent"
    17. android:layout_height="wrap_content"
    18. android:paddingTop="5dp"
    19. android:src="@drawable/home" />
    20. <TextView
    21. android:layout_width="fill_parent"
    22. android:layout_height="wrap_content"
    23. android:gravity="center"
    24. android:text="首页" />
    25. </LinearLayout>
    26. <!-- 第二个菜单项:我的 左边是图片,右边是文字 -->
    27. <LinearLayout
    28. android:layout_width="fill_parent"
    29. android:layout_height="wrap_content"
    30. android:layout_weight="1"
    31. android:background="@drawable/button_normal"
    32. android:gravity="center"
    33. android:orientation="horizontal" >
    34. <ImageView
    35. android:layout_width="wrap_content"
    36. android:layout_height="wrap_content"
    37. android:src="@drawable/mine" />
    38. <TextView
    39. android:layout_width="wrap_content"
    40. android:layout_height="wrap_content"
    41. android:text="我的" />
    42. </LinearLayout>
    43. <!-- 第一个菜单项:更多 上面是图片,下面是文字 -->
    44. <LinearLayout
    45. android:layout_width="fill_parent"
    46. android:layout_height="wrap_content"
    47. android:layout_weight="1"
    48. android:background="@drawable/button_normal"
    49. android:orientation="vertical" >
    50. <ImageView
    51. android:layout_width="fill_parent"
    52. android:layout_height="wrap_content"
    53. android:paddingTop="18dp"
    54. android:src="@drawable/more" />
    55. <TextView
    56. android:layout_width="fill_parent"
    57. android:layout_height="wrap_content"
    58. android:gravity="center"
    59. android:paddingTop="5dp"
    60. android:text="更多" />
    61. </LinearLayout>
    62. </LinearLayout>


最后的效果:
Android 自定义菜单示例 - 到处玩的 - 到处玩的 

这时还没有给选项添加点击事件,作为示例,给“首页”选项添加一个点击事件
   
   
    1. // 设置弹出窗口的位置
    2. popwindow.showAtLocation(layout, Gravity.BOTTOM, 0, 0);
    3. // "首页"按钮的点击事件,用onClickListerner模拟
    4. View home = layout.findViewById(R.id.home);
    5. home.setOnClickListener(new View.OnClickListener() {
    6. @Override
    7. public void onClick(View v) {
    8. Toast.makeText(getApplicationContext(), "恭喜,自定义菜单点击成功", 0)
    9. .show();
    10. popwindow.dismiss();// 关闭弹出菜单
    11. }
    12. });
效果如下:点击选项之后弹出菜单就消失了
Android 自定义菜单示例 - 到处玩的 - 到处玩的 

还有一个问题就是,弹出菜单之后,如果不点击选项,怎么退出弹出菜单,答案是监听back按键,这时,需要一个状态变量标志菜单是否弹出。
最后的完整代码如下:
  
  
    1. package com.tops.custommenudemo;
    2. import android.support.v7.app.ActionBarActivity;
    3. import android.os.Bundle;
    4. import android.util.Log;
    5. import android.view.Gravity;
    6. import android.view.KeyEvent;
    7. import android.view.Menu;
    8. import android.view.MenuItem;
    9. import android.view.View;
    10. import android.widget.PopupWindow;
    11. import android.widget.Toast;
    12. public class MainActivity extends ActionBarActivity {
    13. private View layout;
    14. private PopupWindow popwindow;
    15. private int state = 0;// 标志菜单是否弹出,0为没有弹出,1为弹出
    16. @Override
    17. protected void onCreate(Bundle savedInstanceState) {
    18. super.onCreate(savedInstanceState);
    19. setContentView(R.layout.activity_main);
    20. }
    21. @Override
    22. public boolean onKeyDown(int keyCode, KeyEvent event) {
    23. switch (keyCode) {
    24. case KeyEvent.KEYCODE_MENU:// 按下“menu”按键的动作
    25. // Log.d("tag", "菜单按钮按下");
    26. if (state == 1)
    27. return false;// 菜单已弹出,不处理
    28. // 装载菜单布局文件,没有父窗口,所以第二个参数为null
    29. layout = getLayoutInflater().inflate(R.layout.menu_layout1, null);
    30. // 创建PopupWindow对象,并指定其布局文件和其弹出的位置
    31. popwindow = new PopupWindow(layout, getWindowManager()
    32. .getDefaultDisplay().getWidth(), getWindowManager()
    33. .getDefaultDisplay().getHeight());
    34. // 设置弹出窗口的位置
    35. popwindow.showAtLocation(layout, Gravity.BOTTOM, 0, 0);
    36. // "首页"按钮的点击事件,用onClickListerner模拟
    37. View home = layout.findViewById(R.id.home);
    38. home.setOnClickListener(new View.OnClickListener() {
    39. @Override
    40. public void onClick(View v) {
    41. Toast.makeText(getApplicationContext(), "恭喜,自定义菜单点击成功", 0)
    42. .show();
    43. popwindow.dismiss();// 关闭弹出菜单
    44. state = 0;// 更改标志为未弹出菜单
    45. }
    46. });
    47. state = 1;// 更改标志为已弹出菜单
    48. return false;// 如果不返回true/false,则会继续执行super的方法
    49. case KeyEvent.KEYCODE_BACK:// 按下“back”按键的动作
    50. if (state == 1) {
    51. popwindow.dismiss();
    52. state = 0;// 更改标志为未弹出菜单
    53. } else if (state == 0) {// 这里不能直接写else就finish(),如果有其他情况还要交给后面的系统去处理
    54. finish();
    55. }
    56. return false;// 如果不返回true/false,则会继续执行super的方法
    57. }
    58. // 必须调用此方法,以响应其他按键的按下事件
    59. return super.onKeyDown(keyCode, event);
    60. }
    61. // @Override
    62. // public boolean onCreateOptionsMenu(Menu menu) {
    63. // // Inflate the menu; this adds items to the action bar if it is present.
    64. // getMenuInflater().inflate(R.menu.main, menu);
    65. // return true;
    66. // }
    67. //
    68. // @Override
    69. // public boolean onOptionsItemSelected(MenuItem item) {
    70. // // Handle action bar item clicks here. The action bar will
    71. // // automatically handle clicks on the Home/Up button, so long
    72. // // as you specify a parent activity in AndroidManifest.xml.
    73. // int id = item.getItemId();
    74. // if (id == R.id.action_settings) {
    75. // return true;
    76. // }
    77. // return super.onOptionsItemSelected(item);
    78. // }
    79. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值