Android Studio之菜单栏制作 (五)

弹出式菜单
1、调用new PopupMenu(Context context,View anchor)创建下拉菜单,anchor代表要激发该弹出菜单的组件

2、调用MenuInflater的inflate()方法将菜单资源填充到PopupMenu中

turn super.onOptionsItemSelected(item);
}
return true;
}

}

弹出式菜单
1、调用new PopupMenu(Context context,View anchor)创建下拉菜单,anchor代表要激发该弹出菜单的组件

2、调用MenuInflater的inflate()方法将菜单资源填充到PopupMenu中

3、调用PopupMenu的show()方法显示弹出式菜单

   package com.example.myapplication;

   import androidx.annotation.RequiresApi;
   import androidx.appcompat.app.AppCompatActivity;
   import androidx.appcompat.view.menu.MenuPopupHelper;

   import android.annotation.SuppressLint;
   import android.os.Build;
   import android.os.Bundle;
   import android.view.ContextMenu;
   import android.view.Menu; 
   import android.view.MenuInflater;
   import android.view.MenuItem;
   import android.view.SubMenu; 
   import android.view.View;
   import android.widget.Button;
   import android.widget.PopupMenu;
   import android.widget.TextView;
   import android.widget.Toast;
   import android.widget.TextView;
   import android.widget.Toast; 
   import java.lang.reflect.Field;
   import java.lang.reflect.Method;

    public class MainActivity extends AppCompatActivity {
    //定义按钮的全局变量
    private Button button;
    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 绑定按钮的资源(利用id找到xml文件中的按钮)
        button = findViewById(R.id.button);
        textView = findViewById(R.id.textView);
        registerForContextMenu(textView);

        button.setOnClickListener(new View.OnClickListener() {
            @SuppressLint("RestrictedApi")
            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
            @Override
            public void onClick(View v) {
                //创建PopupMenu
                PopupMenu popupMenu = new PopupMenu(MainActivity.this,button);
                //加载菜单资源
                popupMenu.getMenuInflater().inflate(R.menu.menu2, popupMenu.getMenu());
                //菜单事件监听
                popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){

                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()){
                            case R.id.bu1:
                                Toast.makeText(MainActivity.this,"复制",Toast.LENGTH_LONG).show();
                                break;
                            case R.id.bu2:
                                Toast.makeText(MainActivity.this,"粘贴",Toast.LENGTH_LONG).show();
                                break;
                            case R.id.bu3:
                                Toast.makeText(MainActivity.this,"清除",Toast.LENGTH_LONG).show();
                                break;
                            default:
                                break;
                        }
                        return true;
                    }
                });
                //使用反射,强制显示菜单图标
                 try {
                    Field field = popupMenu.getClass().getDeclaredField("mm");
                        field.setAccessible(true);
                    MenuPopupHelper menuPopupHelper = (MenuPopupHelper) field.get(popupMenu);
                        menuPopupHelper.setForceShowIcon(true);
               }catch (IllegalAccessException | NoSuchFieldException e){
                    e.printStackTrace();
            }
                popupMenu.show();
            }
        });

    }
 }

关于Java代码有很多包名,如果有哪个方法没有找到什么包可以 “Alt+Enter”快捷键帮你找到这个地方的可能需要要导入的包或者其他。

整个代码的引入是从第一个写到最后一个菜单的累加的。

原文地址:https://www.cnblogs.com/wangdayang/p/14913038.html