题目
在该应用中,活动页面视图根节点为垂直的LinearLayout,在布局中依次放置1个TextView,显示个人信息;1个TextView(id为tv_result),显示OptionsMenu(选项菜单)的选中结果。OptionsMenu在应用的动作栏右侧,点击OptionsMenu,弹出菜单项。在本例中,仅演示OptionsMenu的使用方法,功能比较简单,tv_result显示被选中菜单项的结果。OptionsMenu菜单中,“增加”菜单项以图标的形式直接显示在动作栏(或称标题栏、工具栏)中,“修改”和“删除”菜单项则隐藏在菜单中,通过点击OptionsMenu图标,弹出所隐藏的菜单项。
实现效果
步骤
1.新建项目,更改布局文件为my_main.xml
删除app/re/layout/activity_main.xml文件,新建自己的my_main.xml布局文件
其中Root Element设置为LinearLayout,改MainActivity.java中的setContentView(R.layout.my_main)
2.对my_main.xml操作
拖入两个TextView
3.新建菜单
项目模版默认是没有菜单项的,需要手动创建,右键点击项目列表中的res->New->Android Resource File,设置文件名,Resource Type设置为Menu,点击OK即可
4.对opt_menu.xml操作
其中添加icon时会弹出窗口,操作如下:
同理,再增加两个Menu Item,分别为修改、删除
代码展示(有注释)
<?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">
<!--项目模版默认是没有菜单项的,需要手动创建,右键点击项目列表中的res->New->Android Resource File,设置文件名,Resource Type设置为Menu,点击OK即可-->
<!--title显示菜单项文本-->
<!--icon菜单项的图标,在Design界面可以选择,但是需要与app:showAsAction配合使用-->
<!--app:showAsAction="always"表示在动作栏以图标形式显示菜单项,报错按alt+ctrl就行-->
<item
android:id="@+id/opt_add"
android:icon="@android:drawable/ic_menu_add"
android:title="增加"
app:showAsAction="always" />
<item
android:id="@+id/opt_modify"
android:title="修改" />
<item
android:id="@+id/opt_delete"
android:title="删除" />
</menu>
5.MainActivity.java部分
package com.example.zdl_task4_1;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView tv;//必须声明在onCreate()外部,使之成为类的成员变量,而不是方法中的局部变量,因为类的其他方法会用到
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_main);
tv=findViewById(R.id.tv_result);//找TextView的id
}
//onCreateOptionsMenu()应用首次生成选项菜单时被调用,之后不再被调用,适合生成静态菜单
//补充:onPrepareOptionSelected()每次点击选项菜单时被调用,适合生成动态内容的菜单项
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 将res/menu/opt_menu.xml菜单文件填充到menu对象上
// 方法1:获得菜单填充器get方法,再调用其inflate填充方法
getMenuInflater().inflate(R.menu.opt_menu,menu);
// 方法2:创建菜单填充器对象,传入getApplicationContext方法获得应用上下文,后调用inflate填充方法
//new MenuInflater(getApplicationContext()).inflate(R.menu.opt_menu,menu);
return super.onCreateOptionsMenu(menu);
}
//设置点击菜单后的效果,通过onOptionsItemSelected()方法实现
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
String s="";
switch (item.getItemId()){
case R.id.opt_add:
s="增加";
break;
case R.id.opt_modify:
s="修改";
break;
case R.id.opt_delete:
s="删除";
break;
}
tv.setText(s);//在TextView中显示
return super.onOptionsItemSelected(item);
}
}
重点总结
1.记住怎么创建菜单的xml文件(需要新建),怎么给菜单设置图标(icon属性,搭配showAsAction=always使用)
2.记住处理菜单的两个步骤:
(1)重写创建菜单的方法:
onCreateOptionsMenu(),首次生成选项菜单时被调用,之后不再被调用,适合生成静态菜单
onPrepareOptionSelected(),每次点击选项菜单时被调用,适合生成动态内容的菜单项
还要记住将res/menu/ctx_menu.xml菜单文件填充到menu对象上的方法,记住一种即可,我较常用方法1,先获得菜单填充器getMenuInflater()方法,再调用其inflate填充方法
eg:getMenuInflater().inflate(R.menu.opt_menu,menu);
(2)重写选项菜单事件的响应方法,设置菜单点击后的效果
onOptionsItemSelected()
还要记住其中获得对应菜单项id的方法
item.getItemId()
以上总结仅适用于个人,更多总结看下面老师的PPT吧
注:所学内容出自https://space.bilibili.com/549342748/channel/seriesdetail?sid=3616542