当Android开发遇到菜单

Android模拟器右上角隐藏菜单的三点不显示解决办法

在需要显示菜单的Activity类中,添加一个下面的方法,并在创建Android菜单时调用

   private void getOverflowMenu(){

        ViewConfiguration config=ViewConfiguration.get(this);
        Field menuKeyField;
        try {
            menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
            if (menuKeyField!=null) {
                menuKeyField.setAccessible(true);
                menuKeyField.setBoolean(config, false);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

效果如图:

菜单栏不显示解决办法

菜单的两种生成方式

1.在布局文件中生成:在res文件夹下找到menu文件夹,在这个文件夹中建立一个后缀为xml的文件,先添加菜单组group,再添加item
效果图

android菜单

xml文件layout视图

android生成菜单

xml文件源码



<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <group android:id="@+id/group1">
        <item android:id="@+id/item1"
              android:title="菜单项1"></item>
        <item android:id="@+id/item2"
              android:title="菜单项2"></item>
        <item android:id="@+id/item3"
              android:title="菜单项3"></item>
        <item android:id="@+id/item4"
              android:title="菜单项4"></item>
    </group>


</menu>

2.在java代码中动态生成,以PopMenu菜单为例

 @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(0,0x101,1,"新建1").setIntent(new Intent());//组id,itemid,0x101十六进制的257
        menu.add(0,0x101,2,"编辑1");
        menu.add(0,0x101,3,"保存1");
        return true;
    }

实现菜单的点击与长按效果

点击弹出PopMenu菜单

点击弹出PopMenu菜单

长按弹出PopMenu菜单

长按弹出上下文菜单PopMenu

点击右上角,显示菜单项

点击右上角,显示菜单项

另附源码:

import java.lang.reflect.Field;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewConfiguration;
import android.view.ContextMenu.ContextMenuInfo;

import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private TextView tv,textView,textView1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv=(TextView) findViewById(R.id.tv);
        textView=(TextView) findViewById(R.id.textView);
        textView1=(TextView)findViewById(R.id.textView1);
        textView1.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                PopupMenu pm= new PopupMenu(MainActivity.this, textView1);//不能低于api-11版本
                pm.getMenuInflater().inflate(R.menu.popmenu, pm.getMenu());
                pm.setOnMenuItemClickListener(new OnMenuItemClickListener() {

                    @Override
                    public boolean onMenuItemClick(MenuItem arg0) {
                        String message="";
                        switch (arg0.getItemId()) {
                        case R.id.item1:
                            message="菜单项1";
                            break;
                        case R.id.item2:
                            message="菜单项2";
                            break;
                        case R.id.item3:
                            message="菜单项3";
                            break;
                        case R.id.item4:
                            message="菜单项4";
                            break;
                        default:
                            message="没有菜单项被选中";
                            break;
                        }
                        Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();
                        return false;
                    }
                });
                pm.show();

            }
        });
        //注册组件
        registerForContextMenu(tv);
        registerForContextMenu(textView);
        getOverflowMenu();
    }


    @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(0,0x101,1,"新建1").setIntent(new Intent());//组id,itemid,0x101十六进制的257
        menu.add(0,0x101,2,"编辑1");
        menu.add(0,0x101,3,"保存1");
        return true;
    }
    private void getOverflowMenu(){

        ViewConfiguration config=ViewConfiguration.get(this);
        Field menuKeyField;
        try {
            menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
            if (menuKeyField!=null) {
                menuKeyField.setAccessible(true);
                menuKeyField.setBoolean(config, false);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    //上下文菜单,两种生成方式(写在xml中,在java代码中动态生成),长按触发
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {
        // TODO Auto-generated method stub
        super.onCreateContextMenu(menu, v, menuInfo);
        if (v.getId()==R.id.tv) {
            getMenuInflater().inflate(R.menu.main, menu);
        }else {
            getMenuInflater().inflate(R.menu.menu1, menu);
        }

    }
    //选项菜单:右上角隐藏的菜单
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        Toast.makeText(MainActivity.this, "当前菜单的id:"
                    +item.getItemId()+",当前标题:"
                    +item.getTitle()+",组:"
                    +item.getGroupId(), Toast.LENGTH_LONG).show();
        /*switch (item.getItemId()) {
        case R.id.item1:
            Toast.makeText(MainActivity.this, "新建菜单被选中", Toast.LENGTH_SHORT).show();
            break;
        case R.id.item2:
            Toast.makeText(MainActivity.this, "编辑菜单被选中", Toast.LENGTH_SHORT).show();
            break;
        case R.id.item3:
            Toast.makeText(MainActivity.this, "删除菜单被选中", Toast.LENGTH_SHORT).show();
            break;
        case R.id.itemM1:
            Toast.makeText(MainActivity.this, "模板1被选中", Toast.LENGTH_SHORT).show();
            break;
        case R.id.itemM2:
            Toast.makeText(MainActivity.this, "模板2被选中", Toast.LENGTH_SHORT).show();
            break;
        default:
            Toast.makeText(MainActivity.this, "default菜单没有被选中", Toast.LENGTH_SHORT).show();
            break;
        }*/
        return super.onOptionsItemSelected(item);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值