菜单是许多应用类型中常见的界面组件。如要提供熟悉且一致的用户体验,您应使用 Menu API 呈现 Activity 中的用户操作和其他选项。
Android 版本中三种基本菜单或操作呈现效果的创建方法:
选项菜单和应用栏
选项菜单是某个 Activity 的主菜单项集合,供您放置对应用产生全局影响的操作,如“搜索”、“撰写电子邮件”和“设置”。
要实现选项菜单的功能,首先需要重载 OnCreatOptionsMenu() 方法创建菜单,然后通过 onOptionsItemSelected() 方法对菜单被单击事件进行监听和处理。
具体使用步骤如下:
一、在工程的 res 目录下创建一个 menu 目录,用于存放菜单相关的 XML 文件。在该目录下创建 options_menu.xml。
代码如下:
options_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 子菜单 -->
<item
android:id="@+id/paren"
android:title="Item">
<menu>
<item
android:id="@+id/menu_sub1"
android:title="Item" />
<item
android:id="@+id/menu_sub2"
android:title="Item" />
</menu>
</item>
<item
android:id="@+id/menu_delete"
android:title="删除"
app:showAsAction="never" />
<item
android:id="@+id/menu_new"
android:title="新建"
app:showAsAction="never" />
</menu>
二、创建一个activity命名为OptionsMenuActivity,重载 OnCreatOptionsMenu() 方法和 onOptionsItemSelected() 方法。
OptionsMenuActivity.java
//创建选项菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu,menu);
return true;
}
//给菜单选项设置执行命令
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.menu_new:
Toast.makeText(OptionsMenuActivity.this,
"点击了新建",Toast.LENGTH_SHORT)
.show();
return true;
case R.id.menu_delete:
Toast.makeText(OptionsMenuActivity.this,
"点击了删除",Toast.LENGTH_SHORT)
.show();
return true;
case R.id.menu_sub1:
Toast.makeText(OptionsMenuActivity.this,
"点击了子菜单1",Toast.LENGTH_SHORT)
.show();
return true;
case R.id.menu_sub2:
Toast.makeText(OptionsMenuActivity.this,
"点击了子菜单2",Toast.LENGTH_SHORT)
.show();
return true;
default:
return false;
}
}
详细代码如下:
OptionsMenuActivity.java
package com.example.myapplication;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
public class OptionsMenuActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//创建选项菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_menu,menu);
return true;
}
//给菜单选项设置执行命令
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.menu_new:
Toast.makeText(OptionsMenuActivity.this,
"点击了新建",Toast.LENGTH_SHORT)
.show();
return true;
case R.id.menu_delete:
Toast.makeText(OptionsMenuActivity.this,
"点击了删除",Toast.LENGTH_SHORT)
.show();
return true;
case R.id.menu_sub1:
Toast.makeText(OptionsMenuActivity.this,
"点击了子菜单1",Toast.LENGTH_SHORT)
.show();
return true;
case R.id.menu_sub2:
Toast.makeText(OptionsMenuActivity.this,
"点击了子菜单2",Toast.LENGTH_SHORT)
.show();
return true;
default:
return false;
}
}
上下文菜单
上下文菜单是用户长按某元素时出现的浮动菜单。该菜单提供的操作会影响所选内容或上下文框架,使用方法与选项菜单类似。
具体使用步骤如下:
一、在工程的 res 目录下创建一个 menu 目录,用于存放菜单相关的 XML 文件。在该目录下创建 context_menu.xml。
代码如下:
context_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/context1"
android:title="Item" />
<item
android:id="@+id/context2"
android:title="Item" />
<item
android:id="@+id/context3"
android:title="Item" />
</menu>
二、创建一个activity命名为ContextMenuActivity,重载 onCreateContextMenu() 方法和 onContextItemSelected() 方法,另外需要注意的是要通过方法registerForContextMenu( View v )为元素添加上下文菜单,通过长按元素激活。
ContextMenuActivity.java
package com.example.myapplication;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class ContextMenuActivity extends AppCompatActivity {
private TextView tv1;
private TextView tv2;
private TextView tv3;
private TextView tv4;
private TextView tv5;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_context_menu);
tv1 = findViewById(R.id.tv1);
tv2 = findViewById(R.id.tv2);
tv3 = findViewById(R.id.tv3);
tv4 = findViewById(R.id.tv4);
tv5 = findViewById(R.id.tv5);
//为控件注册上下文菜单
registerForContextMenu(tv1);
registerForContextMenu(tv2);
registerForContextMenu(tv3);
registerForContextMenu(tv4);
registerForContextMenu(tv5);
}
//创建上下文菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.context_menu,menu);
}
//给菜单选项设置执行命令
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.context1:
Toast.makeText(ContextMenuActivity.this,
"点击了1",Toast.LENGTH_SHORT)
.show();
return true;
case R.id.context2:
Toast.makeText(ContextMenuActivity.this,
"点击了2",Toast.LENGTH_SHORT)
.show();
return true;
case R.id.context3:
Toast.makeText(ContextMenuActivity.this,
"点击了3",Toast.LENGTH_SHORT)
.show();
return true;
default:
return false;
}
}
}
activity_context_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ContextMenuActivity">
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView1"
android:textSize="30sp"
app:layout_constraintTop_toBottomOf="@+id/tv2" />
<TextView
android:id="@+id/tv2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView1"
android:textSize="30sp"
app:layout_constraintTop_toBottomOf="@+id/tv3"
tools:layout_editor_absoluteX="176dp" />
<TextView
android:id="@+id/tv3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView1"
android:textSize="30sp"
app:layout_constraintTop_toBottomOf="@+id/tv4"
tools:layout_editor_absoluteX="16dp" />
<TextView
android:id="@+id/tv4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView1"
android:textSize="30sp"
app:layout_constraintTop_toBottomOf="@+id/tv5"
tools:layout_editor_absoluteX="16dp" />
<TextView
android:id="@+id/tv5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView1"
android:textSize="30sp"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
弹出菜单
弹出菜单以垂直列表形式显示一系列项目,并且该列表会固定到调用该菜单的视图中。它特别适用于提供与特定内容相关的大量操作,或者为命令的另一部分提供选项。弹出菜单中的操作不会直接影响对应的内容,而上下文操作则会对其产生影响。相反,弹出菜单适用于与 Activity 中的内容区域相关的扩展操作。使用较前面两种复杂一些。
具体使用方法如下:
一、在工程的 res 目录下创建一个 menu 目录,用于存放菜单相关的 XML 文件。在该目录下创建 popup_menu.xml。
代码如下:
popup_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.menutest03.MainActivity" >
<item
android:id="@+id/copy"
android:orderInCategory="100"
android:title="复制"/>
<item
android:id="@+id/delete"
android:orderInCategory="100"
android:title="粘贴"/>
</menu>
二、创建一个activity命名为PopupMenuActivity,在使用弹出式菜单时需要完成以下步骤:
- 创建弹出式菜单实例
- 获取菜单填充实例
- 填充菜单
- 为弹出菜单项设置监听事件
- 展示弹出式菜单
// 创建弹出式菜单实例
PopupMenu popupMenu = new PopupMenu(PopupMenuActivity.this,v);
// 获取菜单填充实例
MenuInflater inflater = popupMenu.getMenuInflater();
// 填充菜单
inflater.inflate(R.menu.popup_menu,popupMenu.getMenu());
// 为弹出菜单项设置监听事件
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {……});
// ****展示弹出式菜单****
popupMenu.show();
详细代码如下:
PopupMenuActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;
public class PopupMenuActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_popup_menu);
button = findViewById(R.id.btn1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 创建弹出式菜单实例
PopupMenu popupMenu = new PopupMenu(PopupMenuActivity.this,v);
// 获取菜单填充实例
MenuInflater inflater = popupMenu.getMenuInflater();
// 填充菜单
inflater.inflate(R.menu.popup_menu,popupMenu.getMenu());
// 为弹出菜单项设置监听事件
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.copy:
Toast.makeText(PopupMenuActivity.this,
"点击了copy",Toast.LENGTH_SHORT)
.show();
return true;
case R.id.paste:
Toast.makeText(PopupMenuActivity.this,
"点击了delete",Toast.LENGTH_SHORT)
.show();
return true;
default:
return false;
}
}
});
// ****展示弹出式菜单****
popupMenu.show();
}
});
}
}
activity_popup_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".PopupMenuActivity">
<Button
android:id="@+id/btn1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="弹出式菜单"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.499" />
</androidx.constraintlayout.widget.ConstraintLayout>
链接:百度网盘下载 提取码:5peu