AI智能
改变未来

Android-UI 三种menu的基本实现

文章目录

  • Menu分类
  • Option
  • option.xml
  • 代码实现
  • Context
    • context.xml
    • 绑定view
    • 代码实现
  • 绑定上下文
    • 代码实现
  • Popup
    • popup.xml
    • 代码实现

    记录三种menu的基本使用方法
    IDE:Android Studio 4.0

    Menu分类

    • 选项菜单OptionMenu
    • 上下文菜单ContextMenu
    • 弹出菜单PopupMenu

    Option


    option.xml

    showAsAction属性值
    always:直接在标题栏显示
    never:不显示
    withText:控制图标和文本一起显示
    ifRoom:有空间就显示

    <?xml version=\"1.0\" encoding=\"utf-8\"?><menu xmlns:android=\"http://schemas.android.com/apk/res/android\"xmlns:app=\"http://schemas.android.com/apk/res-auto\"><itemandroid:id=\"@+id/save\"android:title=\"保存\"app:showAsAction=\"always\" /><itemandroid:id=\"@+id/setting\"android:title=\"设置\" /><item android:title=\"更多\"><menu><itemandroid:id=\"@+id/exit\"android:title=\"退出\" /><item android:title=\"子菜单1\" /></menu></item></menu>

    代码实现

    实现起来相对比较容易,在选中方法里直接用

    switch

    来判断用户点击的是哪一个选项

    //创建OptionMenu@Overridepublic boolean onCreateOptionsMenu(Menu menu) {//加载菜单资源getMenuInflater().inflate(R.menu.option, menu);return true;}//OptionMenu菜单项的选中方法@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {switch (item.getItemId()) {case R.id.save:Toast.makeText(this, \"保存\", Toast.LENGTH_SHORT).show();break;case R.id.setting:Toast.makeText(this, \"设置\", Toast.LENGTH_SHORT).show();break;case R.id.exit:finish();break;}return super.onOptionsItemSelected(item);}

    Context

    context.xml

    <?xml version=\"1.0\" encoding=\"utf-8\"?><menu xmlns:android=\"http://schemas.android.com/apk/res/android\"><itemandroid:id=\"@+id/delete\"android:title=\"删除\" /><itemandroid:id=\"@+id/rename\"android:title=\"重命名\" /></menu>

    绑定view

    这里绑定的是

    ctx_btn

    长按

    ctx_btn

    效果

    代码实现

    先在onCreate方法中进行注册,绑定某个view

    registerForContextMenu(findViewById(R.id.ctx_btn));

    创建 覆盖onCreateContextMenu方法

    //创建ContextMenu@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {getMenuInflater().inflate(R.menu.context, menu);}

    菜单项的操作 覆盖onContextItemSelected方法

    //Context菜单的操作@Overridepublic boolean onContextItemSelected(@NonNull MenuItem item) {switch (item.getItemId()) {case R.id.delete:Toast.makeText(this, \"删除\", Toast.LENGTH_SHORT).show();break;case R.id.rename:Toast.makeText(this, \"重命名\", Toast.LENGTH_SHORT).show();break;}return super.onContextItemSelected(item);}

    绑定上下文

    长按

    ctx_btn

    效果

    代码实现

    实现ActionMode.CallBack方法,并传给对象

    cb

    ActionMode.Callback cb = new ActionMode.Callback() {//创建,在启动上下文模式(startActionMode(Callback))时调用@Overridepublic boolean onCreateActionMode(ActionMode mode, Menu menu) {//这里要返回trueLog.e(\"TAG\", \"创建\");getMenuInflater().inflate(R.menu.context, menu);return true;}//在创建方法后调用@Overridepublic boolean onPrepareActionMode(ActionMode mode, Menu menu) {Log.e(\"TAG\", \"准备\");return false;}//点击时调用@Overridepublic boolean onActionItemClicked(ActionMode mode, MenuItem item) {//这里同样要返回trueLog.e(\"TAG\", \"点击\");switch (item.getItemId()) {case R.id.delete:Toast.makeText(MainActivity.this, \"删除\", Toast.LENGTH_SHORT).show();break;case R.id.rename:Toast.makeText(MainActivity.this, \"重命名\", Toast.LENGTH_SHORT).show();break;}return true;}//上下文操作模式结束时调用@Overridepublic void onDestroyActionMode(ActionMode mode) {Log.e(\"TAG\", \"结束\");}};

    onCreate方法中通过长按监听器启动上下文操作模式

    findViewById(R.id.ctx_btn).setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {startActionMode(cb);return false;}});

    Popup

    点击

    popBtn

    效果

    popup.xml

    <?xml version=\"1.0\" encoding=\"utf-8\"?><menu xmlns:android=\"http://schemas.android.com/apk/res/android\"><itemandroid:id=\"@+id/copy\"android:title=\"复制\" /><itemandroid:id=\"@+id/paste\"android:title=\"粘贴\" /></menu>

    代码实现

    final Button popBtn=findViewById(R.id.pop_btn);popBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//实例化PopupMenu对象(参数2:被锚定的view)PopupMenu menu =new PopupMenu(MainActivity.this,popBtn);//加载菜单资源:利用MenuInflater将Menu资源加载到PopupMenu.getMenu()所返回的Menu对象中//将R.menu.xx对应的菜单资源加载到弹出式菜单中menu.getMenuInflater().inflate(R.menu.popup,menu.getMenu());//为PopupMenu设置点击监听器menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem item) {switch(item.getItemId()){case R.id.copy:Toast.makeText(MainActivity.this,\"复制\",Toast.LENGTH_SHORT).show();break;case R.id.paste:Toast.makeText(MainActivity.this,\"粘贴\",Toast.LENGTH_SHORT).show();break;}return false;}});//最后要记得show一下menu.show();}});
    赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » Android-UI 三种menu的基本实现