Menu
menu是啥?
顾名思义,menu是一个菜单,在一个app中一个Activity中通常要显示非常多的菜单,但是手机的屏幕空间非常有限,因此充分利用屏幕空间在手机界面设计中就变得非常重要,如果你的活动中有非常多的菜单要显示,就可以使用Android中的menu
1.创建menu.xml文件
首先在项目res资源文件夹下新建menu文件夹
然后在该文件夹下新建一个menu.xml类型的文件
main_activity_menu.xml代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group>
<!--每个item必须得有自己独立的id和title(title可以重名)-->
<item android:id="@+id/share"
android:title="分享"
/>
<item android:id="@+id/delete"
android:title="删除"
/>
<item android:id="@+id/edit"
android:title="编辑"
/>
</group>
</menu>
此时左侧的预览框其实已经能显示出来menu被放入Activity后的样子了
差不多这样
然后在MainActivity中注入该menu
在MainAvtivity中重写OnCreateOptionsMenu方法,在方法体注入我们刚刚写好的menu
getMenuInflater().inflate(R.menu.main_activity_menu,menu);
MainActivity代码
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
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_activity_menu,menu);
return super.onCreateOptionsMenu(menu);
}
}
此时运行项目模拟器上面已经可以显示出menu了
标题栏上的三个小点就menu,点击之后显示所有菜单。
菜单点击(被选择的时候的回调方法)onOptionsItemSelected(MenuItem item)
/**
*
* @param item 记得刚刚创建main_activity_menu时自己创建的item项吗?这个参数就是你在menu中选中(点击)的那个item
* @return
*/
@SuppressLint("NonConstantResourceId")
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//通过获取选择(点击)的MenuItem的id来判断你选择了哪一项
switch (item.getItemId()){
case R.id.share:
Toast.makeText(this, "你选择了分享菜单", Toast.LENGTH_SHORT).show();break;
case R.id.delete:
Toast.makeText(this, "你选择了删除菜单", Toast.LENGTH_SHORT).show();break;
case R.id.edit:
Toast.makeText(this, "你选择了编辑菜单", Toast.LENGTH_SHORT).show();break;
}
return super.onOptionsItemSelected(item);
}
在MainActivity中重写此方法,通过item.getItemId()获取MenuItem的id然后进行逻辑代码的编写。就可以得到下图的效果
在代码中添加(不使用menu.xml)
使用menu.add()方法,该方法有多个重载,讲几个常用的
menu.add(String title) //添加一个menuItem,并传入title
/**
*
* @param groupId 代表MenuItem添加进入菜单组的groupId
* @param id 代表MenuItem添本身的id
* @param order 代表的是菜单项的显示顺序。默认是0,表示菜单的显示顺序就是按照add的显示顺序来显示。
* @param title 代表当前MenuItem的title
* @return
*/
menu.add(int groupId,int id,int order,String title)
将上面代码按照动态添加的方法放入menu,也能达到一样的效果
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(1,R.id.share,0,"分享");
menu.add(1,R.id.delete,0,"删除");
menu.add(1,R.id.edit,0,"编辑");
return super.onCreateOptionsMenu(menu);
}
icon和showAsAction属性
在之前的main_activity_menu.xml上为每个item添加上这些属性
<?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">
<group>
<item android:id="@+id/share"
android:title="分享"
android:icon="@drawable/share"
app:showAsAction="always"
/>
<item android:id="@+id/delete"
android:title="删除"
android:icon="@drawable/delete"
app:showAsAction="always"
/>
<item android:id="@+id/edit"
android:title="编辑"
android:icon="@drawable/edit"
app:showAsAction="always"
/>
</group>
</menu>
icon属性:表示菜单的图标
showAsAction: 指定菜单项的显示方式。常用的有ifRoom、never、always、withText,多个属性值之间可以使用|隔开
showAsAction的可选属性值:
名称 | 效果 |
---|---|
always | 菜单项永远不会被收纳到溢出菜单中,因此在菜单项过多的情况下可能超出菜单栏的显示范围。 |
ifRoom | 在空间足够时,菜单项会显示在菜单栏中,否则收纳入溢出菜单中。 |
withText | 无论菜单项是否定义了icon属性,都只会显示它的标题,而不会显示图标。使用这种方式的菜单项默认会被收纳入溢出菜单中。 |
never | 菜单项永远只会出现在溢出菜单中。 |
添加上述参数后页面的显示效果:
可以看到标题栏上多了三个菜单项,显示的形式都是图标。
留下伏笔 收纳溢出菜单中菜单项的显示那么像列表,那有没有像ExpandableListView这样子类似的二级列表呢?
之后更会有menu和底部导航栏的梦幻联动