选项菜单 OptionMenu

  • 再 res 文件夹下创建一个文件夹,命令为:menu ,然后创建menu_option.xml 文件
  • activity中的代码如下:(注意,这里的MenuOptionActivity 需要继承于Activity)
public class MenuOptionActivity extends Activity implements View.OnClickListener {
    private TextView tv_option;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu_option);
        tv_option = findViewById(R.id.tv_option);
        findViewById(R.id.btn_option).setOnClickListener(this);
        findViewById(R.id.btn_skip).setOnClickListener(this);
        setRandomTime();
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_option) {
            // 如果当前界面继承于 AppCompatActivity 并且appcompat 版本不低于22.1.0
            // 那么调用 openOptionsMenu 方法将不会弹出菜单
            openOptionsMenu();
        } else if (v.getId() == R.id.btn_skip) {
            Intent intent = new Intent(this, MenuContextActivity.class);
            startActivity(intent);
        }
    }

    // 在选项菜单的菜单界面创建时调用
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_option, menu);
        return true;
    }

    // 在选项菜单的菜单选项中时调用
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId(); // 获取菜单项的编号
        if (id == R.id.menu_change_time) {
            setRandomTime();
        } else if (id == R.id.menu_change_color) {
            tv_option.setTextColor(getRandomColor());
        } else if (id == R.id.menu_change_bg) {
            tv_option.setBackgroundColor(getRandomColor());
        }
        return true;
    }

    private void setRandomTime() {
        String desc = DateUtil.getNowDateTime() + "这里是菜单显示文本";
        tv_option.setText(desc);
    }

    private int[] mColorArr = {
            Color.BLACK, Color.WHITE, Color.RED, Color.YELLOW, Color.GREEN,
            Color.BLUE, Color.CYAN, Color.MAGENTA, Color.GRAY, Color.DKGRAY
    };
    private int getRandomColor() {
        int random = (int)(Math.random() * 10 % 10);
        return mColorArr[random];
    }
}
  • openOptionsMenu 方法弹出的选项菜单都是在页面下方,如下方红框所示:

上下文菜单 ContextMenu

  • 再 res 文件夹下创建一个文件夹,命令为:menu ,然后创建menu_option.xml 文件,和上面可以公用同一个xml文件
  • activity中的代码如下:
public class MenuContextActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView tv_context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu_context);
        tv_context = findViewById(R.id.tv_context);
        findViewById(R.id.btn_context).setOnClickListener(this);
        setRandomTime();
    }

    @Override
    protected void onResume() {
        /*
         * 给文本视图 tv_context 注册上下文菜单
         * 注册之后,只要长按该事件,app就会自动打开上下文菜单
         */
        registerForContextMenu(tv_context);
        super.onResume();
    }

    @Override
    protected void onPause() {
        // 给文本视图 tv_context 注销上下文菜单
        unregisterForContextMenu(tv_context);
        super.onPause();
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_context) {
            // 点击按钮而非长按打开上下文菜单,此时要先注册,然后显示打开,最后再注销
            registerForContextMenu(v);
            openContextMenu(v);
            unregisterForContextMenu(v);
        }
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.menu_option, menu);
    }

    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        int id = item.getItemId(); // 获取菜单项的编号
        if (id == R.id.menu_change_time) {
            setRandomTime();
        } else if (id == R.id.menu_change_color) {
            tv_context.setTextColor(getRandomColor());
        } else if (id == R.id.menu_change_bg) {
            tv_context.setBackgroundColor(getRandomColor());
        }
        return true;
    }

    private void setRandomTime() {
        String desc = DateUtil.getNowDateTime() + "这里是菜单显示文本";
        tv_context.setText(desc);
    }

    private int[] mColorArr = {
            Color.BLACK, Color.WHITE, Color.RED, Color.YELLOW, Color.GREEN,
            Color.BLUE, Color.CYAN, Color.MAGENTA, Color.GRAY, Color.DKGRAY
    };
    private int getRandomColor() {
        int random = (int)(Math.random() * 10 % 10);
        return mColorArr[random];
    }
}
  • 效果如下:
    • 长按哪里,弹框就从哪里开始显示
    • 点击按钮的话,就会出现在页面中部,菜单外的其他页面区域颜色会变深