一、案例演示 - 选项菜单
1、创建安卓应用
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6533b1e2e78518f8b05b12fcc8ade623.png)
2、添加背景图片
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6dabf6c5861930cb92b03005d7a8dff6.png)
3、字符串资源文件
<resources>
<string name="app_name">选项菜单演示</string>
</resources>
4、主布局资源文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
android:gravity="center"
tools:context=".MainActivity">
</LinearLayout>
5、主界面类
package net.zs.optons_menu_demo;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import android.widget.Toolbar;
public class MainActivity extends AppCompatActivity {
private static final int NEW_MENU = 1;
private static final int OPEN_MENU = 2;
private static final int SAVE_MENU = 3;
private static final int EXIT_MENU = 4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, NEW_MENU, 1, "新建文件");
menu.add(0, OPEN_MENU, 2, "打开文件");
menu.add(0, SAVE_MENU, 3, "保存文件");
menu.add(0, EXIT_MENU, 4, "退出程序");
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case NEW_MENU:
Toast.makeText(this, "你单击了【新建文件】菜单项!", Toast.LENGTH_SHORT).show();
break;
case OPEN_MENU:
Toast.makeText(this, "你单击了【打开文件】菜单项!", Toast.LENGTH_SHORT).show();
break;
case SAVE_MENU:
Toast.makeText(this, "你单击了【保存文件】菜单项!", Toast.LENGTH_SHORT).show();
break;
case EXIT_MENU:
finish();
break;
}
return true;
}
}
6、运行程序,查看效果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6fde061a4eb4f721dc0a52f6e36894cd.gif)
二、案例演示 - 上下文菜单
1、创建安卓应用
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/060bfeb3706204934ebc5d9db87462e6.png)
2、添加图片资源
(1)下载图片资源
- save_file.png
![ad韩国](https://i-blog.csdnimg.cn/blog_migrate/5f872120c0941e90319ae2399a2ec60a.png)
- copy.png
![请添加图片描述](https://i-blog.csdnimg.cn/blog_migrate/4b4f92e4bab5720e38ef9cb72881e241.png)
- cut.png
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/62f042a69fc87278272aa25a82abd921.png)
- edit.png
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/da36a52e15e9f4dc0a43fd7ad1caf18a.png)
- exit.png
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fdfbe183ed187470153648d41102c20e.png)
- file.png
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/569847f6e8100c0519d1360b26e1a769.png)
- new_file.png
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/83cfd88b6bfae6a1a941a78f55062786.png)
- open_file.png
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f06d75edd55cf38b49e7930e68ceae4c.png)
- paste.png
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/517ae99b94b5444f7e0acac8735c16d3.png)
- background.jpg
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7edfc5686505d5d14307287d594c5fa6.jpeg)
(2)拷贝到src/main/res/mipmap-xxxhdpi目录下
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/cab31c1f029799b8516705aeb3485665.png)
3、字符串资源文件
<resources>
<string name="app_name">上下文菜单演示</string>
<string name="file">文件</string>
<string name="edit">编辑</string>
</resources>
4、主布局资源文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
android:padding="15dp"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp"
android:background="#eeeeee">
<TextView
android:id="@+id/tvFile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:text="@string/file"
android:textColor="#0000ff"
android:textSize="20sp" />
<TextView
android:id="@+id/tvEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/edit"
android:textColor="#0000ff"
android:textSize="20sp" />
</LinearLayout>
</LinearLayout>
5、主界面类
package net.zs.context_menu_demo;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.lang.reflect.Method;
public class MainActivity extends AppCompatActivity {
private TextView tvFile;
private TextView tvEdit;
private static final int NEW_MENU_ITEM = 1;
private static final int OPEN_MENU_ITEM = 2;
private static final int SAVE_MENU_ITEM = 3;
private static final int EXIT_MENU_ITEM = 4;
private static final int CUT_MENU_ITEM = 5;
private static final int COPY_MENU_ITEM = 6;
private static final int PASTE_MENU_ITEM = 7;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvFile = findViewById(R.id.tvFile);
tvEdit = findViewById(R.id.tvEdit);
registerForContextMenu(tvFile);
registerForContextMenu(tvEdit);
}
private void setIconEnabled(Menu menu, boolean enabled) {
try {
Class<?> Clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
Method m = Clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true);
m.invoke(menu, enabled);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
setIconEnabled(menu, true);
switch (v.getId()) {
case R.id.tvFile:
menu.setHeaderIcon(R.mipmap.file);
menu.setHeaderTitle("文件");
menu.add(1, NEW_MENU_ITEM, 1, "新建").setIcon(R.mipmap.new_file);
menu.add(1, OPEN_MENU_ITEM, 2, "打开").setIcon(R.mipmap.open_file);
menu.add(1, SAVE_MENU_ITEM, 3, "保存").setIcon(R.mipmap.save_file);
menu.add(1, EXIT_MENU_ITEM, 4, "退出").setIcon(R.mipmap.exit);
break;
case R.id.tvEdit:
menu.setHeaderIcon(R.mipmap.edit);
menu.setHeaderTitle("编辑");
menu.add(2, CUT_MENU_ITEM, 1, "剪切").setIcon(R.mipmap.cut);
menu.add(2, COPY_MENU_ITEM, 2, "复制").setIcon(R.mipmap.copy);
menu.add(2, PASTE_MENU_ITEM, 3, "粘贴").setIcon(R.mipmap.paste);
break;
}
}
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case NEW_MENU_ITEM:
Toast.makeText(this, "你单击了【新建】菜单项!", Toast.LENGTH_SHORT).show();
break;
case OPEN_MENU_ITEM:
Toast.makeText(this, "你单击了【打开】菜单项!", Toast.LENGTH_SHORT).show();
break;
case SAVE_MENU_ITEM:
Toast.makeText(this, "你单击了【保存】菜单项!", Toast.LENGTH_SHORT).show();
break;
case EXIT_MENU_ITEM:
finish();
break;
case CUT_MENU_ITEM:
Toast.makeText(this, "你单击了【剪切】菜单项!", Toast.LENGTH_SHORT).show();
break;
case COPY_MENU_ITEM:
Toast.makeText(this, "你单击了【复制】菜单项!", Toast.LENGTH_SHORT).show();
break;
case PASTE_MENU_ITEM:
Toast.makeText(this, "你单击了【粘贴】菜单项!", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
}
6、运行程序,查看效果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/38733955a09f802acb1a1053fc60e1c6.gif)
三、案例演示 - 子菜单
1、创建安卓应用
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d4f87265db0fec000baba3c32c968e75.png)
2、添加背景图片
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/885ad23c8b47603ea9f8d1b3f83eab96.png)
3、主布局资源文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
</LinearLayout>
4、主界面类
package net.zs.submenu_demo;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
private LinearLayout root;
private static final int SET_COLOR_MENU = 0;
private static final int RED_MENU_ITEM = 1;
private static final int GREEN_MENU_ITEM = 2;
private static final int BLUE_MENU_ITEM = 3;
private static final int RESET_MENU_ITEM = 4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
root = findViewById(R.id.root);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
SubMenu setColorSubMenu = menu.addSubMenu(0, SET_COLOR_MENU, 1, "设置颜色");
setColorSubMenu.add(0, RED_MENU_ITEM, 1, "红色");
setColorSubMenu.add(0, GREEN_MENU_ITEM, 2, "绿色");
setColorSubMenu.add(0, BLUE_MENU_ITEM, 3, "蓝色");
setColorSubMenu.add(0, RESET_MENU_ITEM, 4, "重置");
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case RED_MENU_ITEM:
root.setBackgroundColor(Color.RED);
break;
case GREEN_MENU_ITEM:
root.setBackgroundColor(Color.GREEN);
break;
case BLUE_MENU_ITEM:
root.setBackgroundColor(Color.BLUE);
break;
case RESET_MENU_ITEM:
root.setBackgroundResource(R.drawable.background);
break;
}
return true;
}
}
5、运行程序,查看效果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4b6027b5540a5b1e15503cdf4d82bf8c.gif)
四、案例演示 - 利用菜单配置文件生成菜单
1、创建安卓应用
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e7f2c08fb807b791981f843bac9261f5.png)
2、添加图片资源
- 案例二中已经发布了需要用的图片资源,请自行下载。
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d8149483a9ad215399f3f9817691aa5b.png)
3、主布局资源文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
tools:context=".MainActivity">
</LinearLayout>
4、字符串资源文件
<resources>
<string name="app_name">利用XML配置生成菜单</string>
<string name="file_menu">文件</string>
<string name="new_file">新建文件</string>
<string name="open_file">打开文件</string>
<string name="save_file">保存文件</string>
<string name="exit">退出程序</string>
<string name="edit_menu">编辑</string>
<string name="cut">剪切</string>
<string name="copy">复制</string>
<string name="paste">粘贴</string>
</resources>
5、自定义菜单配置文件
- 在res目录里创建menu目录,然后在里面创建菜单配置文件
main.xml
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/b4f68ef5a8d205c91d1cf36e0952e90a.png)
- 源代码
<?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"
xmlns:tools="http://schemas.android.com/tools"
tools:context="net.zs.xml_menu.MainActivity">
<item
android:id="@+id/file_menu"
android:title="@string/file_menu"
app:showAsAction="always">
<menu>
<item
android:id="@+id/new_file_menu_item"
android:icon="@mipmap/new_file"
android:title="@string/new_file"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/open_file_menu_item"
android:icon="@mipmap/open_file"
android:title="@string/open_file"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/save_file_menu_item"
android:icon="@mipmap/save_file"
android:title="@string/save_file"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/exit_menu_item"
android:icon="@mipmap/exit"
android:title="@string/exit"
app:showAsAction="ifRoom|withText" />
</menu>
</item>
<item
android:id="@+id/edit_menu"
android:title="@string/edit_menu"
app:showAsAction="always">
<menu>
<item
android:id="@+id/cut_menu_item"
android:icon="@mipmap/cut"
android:title="@string/cut"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/copy_menu_item"
android:icon="@mipmap/copy"
android:title="@string/copy"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/paste_menu_item"
android:icon="@mipmap/paste"
android:title="@string/paste"
app:showAsAction="ifRoom|withText" />
</menu>
</item>
</menu>
6、主界面类
package net.zs.xml_menu;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.new_file_menu_item:
toast("新建文件");
break;
case R.id.open_file_menu_item:
toast("打开文件");
break;
case R.id.save_file_menu_item:
toast("保存文件");
break;
case R.id.exit_menu_item:
finish();
break;
case R.id.cut_menu_item:
toast("剪切");
break;
case R.id.copy_menu_item:
toast("复制");
break;
case R.id.paste_menu_item:
toast("粘贴");
break;
}
return true;
}
public void toast(String text) {
Toast.makeText(this, "你单击了【" + text + "】菜单项!", Toast.LENGTH_SHORT).show();
}
}
7、运行程序,查看效果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/cab7d45b9bf30beb87150b665d6d0620.gif)
8、修改菜单配置文件
- 删除两个
app:showAsAction="always"
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9069cee4d4cd221a4c45d66da0d2aa37.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/6c8b04f14cb9f6dfb5a99888be7bb767.png)
- 源代码
<?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"
xmlns:tools="http://schemas.android.com/tools"
tools:context="net.zs.xml_menu.MainActivity">
<item
android:id="@+id/file_menu"
android:title="@string/file_menu">
<menu>
<item
android:id="@+id/new_file_menu_item"
android:icon="@mipmap/new_file"
android:title="@string/new_file"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/open_file_menu_item"
android:icon="@mipmap/open_file"
android:title="@string/open_file"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/save_file_menu_item"
android:icon="@mipmap/save_file"
android:title="@string/save_file"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/exit_menu_item"
android:icon="@mipmap/exit"
android:title="@string/exit"
app:showAsAction="ifRoom|withText" />
</menu>
</item>
<item
android:id="@+id/edit_menu"
android:title="@string/edit_menu">
<menu>
<item
android:id="@+id/cut_menu_item"
android:icon="@mipmap/cut"
android:title="@string/cut"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/copy_menu_item"
android:icon="@mipmap/copy"
android:title="@string/copy"
app:showAsAction="ifRoom|withText" />
<item
android:id="@+id/paste_menu_item"
android:icon="@mipmap/paste"
android:title="@string/paste"
app:showAsAction="ifRoom|withText" />
</menu>
</item>
</menu>
9、再次运行,查看效果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d621fba18b7a521c3c516c22c5381a0f.gif)