目 录
©本文由博主原创,未经允许,不得转载相关博文内容
-
介绍
在 android 中经常看到可以点击一个按钮跳出一个类似对话框的界面,在这个界面里可以存放一些菜单选项并且可以赋予点击事件。现在来看一个这样的菜单效果,如 Actionbar 的 menu 菜单,点击 menu 按钮可以弹出更多的子选项按钮,效果图如下:
-
创建 menu 资源文件
如上图的效果,在 activity 中已经提供了这样的一个方法可以创建选项菜单,这个方法为:onCreateOptionMenu(Menu menu);我们只需要在 activity 里面重写此方法即可实现上图的效果。
首先,我们需要在 res 资源文件夹下新建一个 menu 的文件夹,此文件夹下即存放 xml 文件的目录,我们新建一个 option.xml,
然后在其中写入需要的 item 资源,这里必须要写入两个属性,一个是:id,一个是:title
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_1"
android:title="menu one" />
<item
android:id="@+id/menu_2"
android:title="menu_two" />
<item
android:id="@+id/menu_3"
android:title="menu_three" />
</menu>
-
关联活动,绑定事件
然后在 activity 中重写 onCreateOptionMenu 方法,加载我们刚刚的 option.xml 文件,然后要返回一个 true ,表示启用菜单:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.options, menu);
return true;
}
重新运行一下,然后你就会看到菜单效果了。
光是有菜单不行,我们应该给予它每一个子选项的点击事件,这个 activity 也已经有了,我们只需要重写 onOptionsItemSelected(MenuItem item);方法就可以绑定点击事件了,与 Button 的绑定事件类似。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_1:
Toast.makeText(this,"option 1",Toast.LENGTH_SHORT).show();
break;
case R.id.menu_2:
Toast.makeText(this,"option 2",Toast.LENGTH_SHORT).show();
break;
case R.id.menu_3:
Toast.makeText(this,"option 3",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
到此为止,我们的 menu 就算是完成了,算是非常简单。但是有一个问题,我发现 menu 跑到了 actionbar 的上方去了,也就是说把 actionbar 给挡住了,这样显得不那么美观,所以我们就要想办法让它下来一点,让它显示到 actionbar 下方,比如这个样子的效果:
-
修改样式
这样子看起来效果不错,至少不会把 actionbar 给挡住了。为了实现这样的效果,我们就要去自定义它的一个主题,这个主题名字叫做:actionbarOverflowMenuStyle 。
我们在 appTheme 下加入这个 item ,name = actionbarOverflowMenuStyle , 这里的 name 不可以写别的,否则将会报异常:not found,所以我们的 styles.xml 代码如下:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!--suppress AndroidDomInspection -->
<item name="actionOverflowMenuStyle">@style/AppOverflowMenuStyle</item>
</style>
<style name="AppOverflowMenuStyle" parent="Base.Widget.AppCompat.Light.PopupMenu.Overflow">
<!-- 不让它覆盖 actionbar -->
<item name="overlapAnchor">false</item>
<!-- 设置弹出的背景颜色 -->
<item name="android:popupBackground">#f33333</item>
</style>
</resources>
修改后的结果:
©原文链接:https://blog.csdn.net/smile_Running/article/details/87898007
©作者博客 ID:smile_running