在我们的手机中有很多样式的菜单,比如:我们的短信界面,每条短信,我们长按都会出现一个菜单,还有很多的种类。那么现在,我们就来详细的讨论一下安卓中的菜单

 Android的控件中就有这么一个,叫做Menus。就是菜单的意思,他基本分为三种:选项式菜单、上下文菜单、弹出式菜单

我们先来看第一种:选项式菜单

  那么什么是选项式菜单呢? 就是当我们点击一个菜单的时候会弹出来一个菜单

如上图所示,右上角的那三个小点 就是菜单按钮,当我们点击时就会弹出一个菜单,这就是一个选项是菜单,既然我们知道是什么东西了,我们自然要做出来嘛~

我们来分析一下,这个选项式菜单怎么做:

  我们知道弹出来的菜单是有布局的,那么我们就创建这样的一个文件,但是这个文件不同于layout。这个文件是menus专用的,需要在res下创建一个menu的一个目录,然后我们在menu目录中创建一个文件

我们再来分析下Activity中应该如何实现:

  我们需要重写父类的onCreateOptionMenu()方法和onOptionsItemSelected()方法

  这两个方法是干什么的呢? 其中的onCreateOptionMenu()方法是用来创建这样的一个菜单的,那么onOptionsItemSelected()方法就是设置点击菜单后的点击事件

然后,我们根据上述的分析,来操作一下:

  我们首先来在res下创建menu目录,并新建一个文件

<?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">
<item
android:id="@+id/item_op_caomao"
android:icon="@mipmap/lufei_titile"
android:orderInCategory="100"
android:title="草帽"
app:showAsAction="ifRoom">
<menu>
<item
android:id="@+id/item_op_lufei"
android:icon="@mipmap/lufei"
android:orderInCategory="100"
android:title="路飞"
app:showAsAction="ifRoom" />
</menu>
</item>
<item
android:id="@+id/item_op_haijun"
android:icon="@mipmap/aisi"
android:orderInCategory="100"
android:title="海军"
app:showAsAction="ifRoom">
<menu>
<item
android:id="@+id/item_op_simoge"
android:icon="@mipmap/simoge"
android:orderInCategory="100"
android:title="斯摩格"
app:showAsAction="ifRoom"/>
</menu>
</item>
<item
android:id="@+id/item_op_hongxin"
android:icon="@mipmap/xiangkesi"
android:orderInCategory="100"
android:title="红心"
app:showAsAction="ifRoom">
<menu>
<item
android:id="@+id/item_op_luo"
android:icon="@mipmap/duolanan"
android:orderInCategory="100"
android:title="多拉男"
app:showAsAction="ifRoom" />
</menu>
</item>
</menu>

  在这里,我们创建这么一个文件,其中的item就是每个菜单的菜单项,我们为其设置了ID、图标(icon)、子菜单(menu)等属性。

  我们来仔细看一下showAsAction属性,这个属性要求必须用app的命名空间,而我们默认是android的命名空间,那么我们就在上面定义一个app的命名空间,并使用,其中的值,也就是ifRoom的意思就是当屏幕上有空余的地方就显示图标,否则就显示“三个小点”

然后我们来到我们的Activity中,去编写代码

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} /**
* 重写的父类的方法
* @param menu
* @return
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//通过菜单加载器获得菜单的布局
getMenuInflater().inflate(R.menu.item_menus,menu);
return super.onCreateOptionsMenu(menu);
} /**
* 重写的父类方法(用作点击事件)
* @param item
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//判断item的id
switch (item.getItemId()){
case R.id.item_op_lufei:
//弹出一个吐司
Toast.makeText(this, "路飞", Toast.LENGTH_SHORT).show();
break;
case R.id.item_op_luo:
Toast.makeText(this, "ROOM!!", Toast.LENGTH_SHORT).show();
break;
case R.id.item_op_simoge:
Toast.makeText(this, "斯摩格", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
}

我们这么一个选项式菜单就编写完成了,我们来看一下运行的结果吧

我们的运行结果是从左往右一次运行的哦~

选项式菜单,我们就完成了。

接下来,我们来看第二种,也就是上下文菜单:

  那么什么是上下文菜单呢?上下文菜单是需要依附在某个控件之上的,需要长按该控件,会弹出来一个菜单,例如:我们以前的手机,在我们按住短信的时候,会弹出一个小菜单,提示你转发啊、删除啊什么的,那么就是一个上下文菜单。

我们来实现一下

我们还是来分析一下都需要怎么做:

  我们首先需要一个控件让上下文菜单去依附,我们就在主布局文件上创建一个TextView好了。

  然后,我们还是需要一个弹出的菜单的布局,我们在res下创建一个menu目录,在目录下创建菜单的文件

  我们的布局暂时就这么多

我们来分析下Activity中如何去实现:

  首先,我们找到需要的控件,就是那个TextView,我们还需要注册一个长按的这么一个事件,使用registerForContextMenu()方法

  然后,我们重写父类的onCreateContextMenu()方法和onContextItemSelected()方法

    这两个方法中 onCreateContextMenu()方法是为了创建一个上下文菜单,onContextItemSelected()方法就是点事件了。这个和选项式菜单就不一样了哦

然后我们根据上面的分析来实现一下:

  首先,我们来创建菜单的布局文件:  

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/item_content_one"
android:title="摁你了,怎么地!给你变成蓝色"
android:orderInCategory="100"/>
<item
android:id="@+id/item_content_two"
android:title="摁你了,怎么地!给你变成黄色"
android:orderInCategory="200"/>
<item
android:id="@+id/item_content_three"
android:title="摁你了,怎么地!给你变成红色"
android:orderInCategory="300"/>
</menu>

  然后,我们来看主界面菜单的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="application.smile.menus.Main2Activity">
<TextView
android:id="@+id/tv_dese"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="不服你摁我"
android:textSize="50sp"/>
</RelativeLayout>

现在,我们再来看我们的Activity中是如何实现的:

public class Main2Activity extends AppCompatActivity {

    private TextView tv_dese;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//找到我们关心的控件
tv_dese = (TextView) findViewById(R.id.tv_dese);
//注册长按的事件
registerForContextMenu(tv_dese);
} @Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
//根据菜单加载器,加载菜单布局
getMenuInflater().inflate(R.menu.content_menus,menu);
} @Override
public boolean onContextItemSelected(MenuItem item) {
//根据id查找点击的是那个菜单项
switch (item.getItemId()){
case R.id.item_content_one:
//改变TextView上字体的颜色
tv_dese.setTextColor(Color.BLUE);
break;
case R.id.item_content_two:
tv_dese.setTextColor(Color.YELLOW);
break;
case R.id.item_content_three:
tv_dese.setTextColor(Color.RED);
break;
}
return super.onContextItemSelected(item);
}
}

这样,我们就完成了,我们来测试一下吧

我们发现,我们长按之后就弹出来了菜单,然后我们选择菜单就改变了文字的颜色

这样,我们的上下文菜单就完成了。

最后,我们来看一下弹出式菜单

那么什么是弹出式菜单呢? 简单说是弹出来的菜单嘛~哈哈,就是当我们点击一个控件的时候就会弹出来一个菜单,这个弹出和选项式可不同哦。这个的弹出菜单是在该控件的下方出现,如果下方没有地方了,就在上方出现

我们来分析一下:

  首先,我们还是需要一个控件让弹出式菜单去依附,在这里,我们就使用imageview,并设置onclick属性为了好看点儿

  然后,我们仍然需要菜单的布局,与前两种一致

然后我们来分析一下Acitivity:

  我们要在Activity中写以onclick属性值命名的点击事件(这个是imageView的点击事件)(这里为什么有去找ImageView呢?因为onclick方法参数中的view就是我们点击的控件,也就是该程序中的ImageView)

  然后,我们要实现OnMenuItemClickListener接口并重写onMenuItemClick()方法 作为菜单的点击事件

接下来,我们根据我们的分析来实现弹出式菜单

  首先,我们需要在主界面布局文件中定义一个ImageView,并设置onClick属性

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="application.smile.menus.Main3Activity"> <ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_menu_add"
android:onClick="show"
/>
</RelativeLayout>

  然后,我们在res下的menu目录下创建一个菜单的布局文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/item_popup_1"
android:orderInCategory="100"
android:title="标题一"></item>
<item
android:id="@+id/item_popup_2"
android:orderInCategory="200"
android:title="标题二"></item>
<item
android:id="@+id/item_popup_3"
android:orderInCategory="300"
android:title="标题三"></item>
<item
android:id="@+id/item_popup_4"
android:orderInCategory="400"
android:title="标题四" />
</menu>

现在我们的这些布局文件算是都写完了,然后我们来看Activity中的具体实现

public class Main3Activity extends Activity implements PopupMenu.OnMenuItemClickListener{

    private PopupMenu popupMenu;

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
}
public void show(View v){
//实例化一个弹出式菜单,传入上下文和控件
popupMenu = new PopupMenu(this,v);
//根据菜单填充器获得菜单的布局
popupMenu.getMenuInflater().inflate(R.menu.popup_menus1,popupMenu.getMenu());
//设置菜单的点击事件
popupMenu.setOnMenuItemClickListener(this);
//显示菜单
popupMenu.show();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.item_popup_1:
Toast.makeText(Main3Activity.this,"你点击了第一个标签",Toast.LENGTH_LONG).show();
break;
case R.id.item_popup_2:
Toast.makeText(Main3Activity.this,"你点击了第二个标签",Toast.LENGTH_LONG).show();
break;
case R.id.item_popup_3:
Toast.makeText(Main3Activity.this,"你点击了第三个标签",Toast.LENGTH_LONG).show();
break;
}
return true;
}
}

然后,我们来看一下运行的结果:

这样,我们的弹出式菜单就完成了

我们来看一下这三个在Activity中的区别:

  选项式菜单:重写父类的onCreateOptionsMenu()方法 和 父类的onOptionsItemSelected()方法

  上下文菜单:重写父类的onCreateContextMenu()方法 和 父类的onContextItemSelected()方法

  弹出式菜单:写onclick属性对应的点击事件  和 OnMenuItemClickListener接口的onMenuItemClick()方法

让程序写入生命,将代码融入灵魂

                    -------smile、zj

Android基本控件之Menus的更多相关文章

  1. Android 开源控件与常用开发框架开发工具类

    Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ...

  2. android 基础控件(EditView、SeekBar等)的属性及使用方法

        android提供了大量的UI控件,本文将介绍TextView.ImageView.Button.EditView.ProgressBar.SeekBar.ScrollView.WebView ...

  3. Android:控件布局(相对布局)RelativeLayout

    RelativeLayout是相对布局控件:以控件之间相对位置或相对父容器位置进行排列. 相对布局常用属性: 子类控件相对子类控件:值是另外一个控件的id android:layout_above-- ...

  4. Android:控件布局(线性布局)LinearLayout

    LinearLayout是线性布局控件:要么横向排布,要么竖向排布 决定性属性:必须有的! android:orientation:vertical (垂直方向) .horizontal(水平方向) ...

  5. 矩阵, 矩阵 , Android基础控件之ImageView

    天下文章大家抄,以下所有内容,有来自copy,有来自查询,亦有自己的总结(目的是总结出自己的东西),所以说原创,不合适,说是转载也不恰当,所以我称之为笔记,可惜没有此分类选项,姑且不要脸一点,选择为原 ...

  6. Android给控件添加触摸回调

    Android给控件添加触摸回调 脑补一个场景,一个页面点击某个按钮会弹出PopupWindow,然后点击PopupWindow以外的任意位置关闭 效果图 实现方法 可以在布局的最外层容器监听触摸事件 ...

  7. Android 基本控件相关知识整理

    Android应用开发的一项重要内容就是界面开发.对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户.作为一个程序员如何才能开发出友好的图形界 ...

  8. Github上star数超1000的Android列表控件

    Android开发中,列表估计是最最常使用到的控件之一了.列表相关的交互如下拉刷新,上拉更多,滑动菜单,拖动排序,滑动菜单,sticky header分组,FAB等等都是十分常见的体验.Github中 ...

  9. Android:控件布局(相对布局)RelativeLayout(转)

    相对布局常用属性: 子类控件相对子类控件:值是另外一个控件的id android:layout_above----------位于给定DI控件之上android:layout_below ------ ...

随机推荐

  1. 【原】Storm Tutorial

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...

  2. What do data scientist do?

    What do data scientist do? 1. Define the question 2.Define the ideal data set 3.Determine what data ...

  3. Winxp下搭建SVN服务器

    本文介绍一种在winxp下搭建SVN服务器的方法. (1) 需要下载Slik-Subversion和TortoiseSVN两个软件.我使用的版本是Slik-Subversion-1.8.3-1-win ...

  4. vs2010 无法连接到asp.net development server

    http://blog.csdn.net/xqf309/article/details/7881257 今天打开之前的程序,按了F5进行调试,等了会弹出窗体来说:无法连接到asp.net develo ...

  5. InputFormat,OutputFormat,InputSplit,RecordRead(一些常见面试题),使用yum安装64位Mysql

    列举出hadoop常用的一些InputFormat InputFormat是用来对我们的输入数据进行格式化的.TextInputFormat是默认的. InputFormat有哪些类型? DBInpu ...

  6. sys.default_constraints

    作为默认定义且 sys.objects.type = D 的每个对象在表中各对应一行, 该默认定义是作为 CREATE TABLE 或 ALTER TABLE 语句的一部分创建的, 而不是作为 CRE ...

  7. CoffeeScript学习(1)——Quick Start

    什么是CoffeeScript CoffeeScript 是一门编译到 JavaScript 的小巧语言. 在 Java 般笨拙的外表下, JavaScript 其实有着一颗华丽的心脏. Coffee ...

  8. STM32的GPIO使用的函数剖析

    转载http://blog.csdn.net/wuwuhuizheyisheng/article/details/8239599 STM32的GPIO总结 作者:JCY 该文是自己学习了一段STM32 ...

  9. thymeleaf中的Literals

    Literals即为文字 一.Text literals:文本文字 文本文字只是字符串指定的单引号之间.他们可以包含任何字符,但你应避免任何单引号里面\ ' <p> Now you are ...

  10. CSS基础(03)

    1.简单了解浏览器是如何渲染页面和加载页面            浏览器就是通过HTTP 协议与服务器进行通信,取到数据之后进行渲染的过程,如图:    这图是园友的看着挺符合我思路就直接拿来用了,从 ...