简单的 Android 菜单
Android 创建简单的菜单
一:上下文菜单:
1.在 res 下创建菜单项资源文夹 menu
app->右击res->new->android resourse directory->resourse type->menu
2.编写xml代码(菜单代码)
进入Text下编写代码
代码(随便的一段代码):
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.a82037.cx06.CTENUActivity"> <group android:checkableBehavior="single"> <item android:id="@+id/apple" android:title="苹果"/> <item android:id="@+id/banana" android:title="香蕉"/> <item android:id="@+id/pear" android:title="梨"/> <item android:id="@+id/pitch" android:title="桃子"/> </group> </menu>
对应的Java代码:
package com.example.a82037.cx06; import android.app.Activity; import android.os.Bundle; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; public class CTENUActivity extends Activity { TextView tv1; Button bt1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_ctenu); tv1=findViewById(R.id.tv1); bt1=findViewById(R.id.bt1); registerForContextMenu(bt1); } public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo){ getMenuInflater().inflate(R.menu.ctmenu,menu); } public boolean onContextItemSelected(MenuItem item){ int id=item.getItemId(); if(id==R.id.apple){ tv1.setText("您选择了苹果"); return true; }else if(id==R.id.banana){ tv1.setText("您选择了香蕉"); return true; }else if(id==R.id.pear){ tv1.setText("您选择了梨"); return true; }else if(id==R.id.pitch){ tv1.setText("您选择了桃子"); return true; } return super.onContextItemSelected(item); } }
3.说明:
我用了一个TextView来显示内容;按钮来实现长按出现菜单(这个按钮可以是其他东西,比如TextView,然后在里面加点字,就实现了长按文字出现菜单);
二:功能菜单及其子菜单:
代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.a82037.cx06.OPMENUActivity"> <item android:id="@+id/deptmenu1" android:title="计算机系"> <menu> <item android:id="@+id/mojormenu1" android:title="计算机应用"/> <item android:id="@+id/mojrmwnu2" android:title="软件技术"/> </menu> </item> <item android:id="@+id/deptmenu2" android:title="电子商务"/> <item android:id="@+id/deptmenu3" android:title="信息管理" /> </menu>
package com.example.a82037.cx06; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class OPMENUActivity extends Activity { TextView tv1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_opmenu); tv1=findViewById(R.id.tv1); } public boolean onCreateOptionsMenu(Menu menu){ getMenuInflater().inflate(R.menu.opmenu,menu); return true; } public boolean onOptionsItemSelected(MenuItem item){ int id=item.getItemId(); if(id==R.id.mojormenu1){ tv1.setText("您选择了计算机系计算机应用专业"); return true; }else if(id==R.id.mojrmwnu2){ tv1.setText("您选择了计算机系软件技术专业"); return true; } return super.onOptionsItemSelected(item); } }
这个目录是点击菜单(传统安卓三大金刚键的最左边那个)就会有的,TextView来显示所选内容;
三:动态菜单:
代码:动态菜单,内容都在java代码里写,所以xml就很简单
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.a82037.cx06.OPMENUActivity"> </menu>
package com.example.a82037.cx06; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView; public class POPActivity extends Activity { TextView tv1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_pop); tv1=findViewById(R.id.tv1); } public boolean onPrepareOptionsMenu(Menu menu){ String currentext=tv1.getText().toString(); if("软件技术".equals(currentext)){ menu.clear(); menu.add(0,501,1,"软件1班"); menu.add(0,502,2,"软件2班"); menu.add(0,503,3,"软件3班"); menu.add(0,504,4,"转到计算机应用菜单"); } if("计算机应用".equals(currentext)){ menu.clear(); menu.add(0,601,1,"计应1班"); menu.add(0,602,2,"计应2班"); menu.add(0,603,3,"转到软件技术菜单"); } return super.onPrepareOptionsMenu(menu); } public boolean onCreateOptionsMenu(Menu menu){ getMenuInflater().inflate(R.menu.po,menu); return true; } public boolean onOptionsItemSelected(MenuItem item){ int id=item.getItemId(); if(id==504){ tv1.setText("计算机应用"); return true; }else if(id==603){ tv1.setText("软件技术"); return true; } return super.onOptionsItemSelected(item); } }
四:一些小东西:
1. 菜单 (1) 使用xml定义Menu 在Android工程目录下的res包下,右键选择New菜单项下的Android resource directory,并以menu命名文件夹的名字;右键menu文件夹,选择Menu resource file选项,创建main_menu.xml文件,菜单资源文件就创建在res/menu目录中。 菜单资源文件必须使用<menu>标签作为根节点。除了<menu>标签外,还有另外两个标签用于设置菜单项和分组,这两个标签是<item>和<group>。 <menu>标签没有任何属性,但可以嵌套在<item>标签中,表示子菜单的形式。不过<item>标签中不能再嵌入<item>标签。 (2)<item>标签的属性含义如下: Id:表示菜单项的资源ID menuCategory:同种菜单项的种类。该属性可取4个值:container、system、secondary和alternative。通过menuCategroy属性可以控制菜单项的位置。例如将属性设为system,表示该菜单项是系统菜单,应放在其他种类菜单项的后面。 orderInCategor:同种类菜单的排列顺序。该属性需要设置一个整数值。例如 menuCategory属性值都为system的3个菜单项(item1、item2和item3)。将这3个菜单项的orderInCategory属性值设为3、2、1,那么item3会显示在最前面,而item1会显示在最后面。 title:菜单项标题(菜单项显示的文本) titleCondensed:菜单项的短标题。当菜单项标题太长时会显示该属性值 icon:菜单项图标资源ID alphabeticShortcut:菜单项的字母快捷键 numericShortcut:菜单项的数字快捷键 checkable:表示菜单项是否带复选框。该属性可设计为true或false checked:如果菜单项带复选框(checkable属性为true),该属性表示复选框默认状态是否被选中。可设置的值为true或false visible:菜单项默认状态是否可视 enable:菜单项默认状态是否被激活 (3)<group>标签的属性含义如下: id:表示菜单组的ID menuCategory:与<item>标签的同名属性含义相同。只是作用域为菜单组 orderInCategory:与<item>标签的同名属性含义相同。只是作用域为菜单组 checkableBehavior:设置该组所有菜单项上显示的选择组件(CheckBox或Radio Button)。如果将该属性值设为all,显示CheckBox组件;如果设为single,显示Radio Button组件;如果设为none,显示正常的菜单项(不显示任何选择组件)。all(non-exclusive/checkboxes),single(exclusive/radiobuttons). visible:表示当前组中所有菜单项是否显示。该属性可设置的值是true或false enable:表示当前组中所有菜单项是否被激活。该属性可设置的值是true或false 2. 功能菜单 options menu 按Menu键就会显示,用于当前的Activity。 它包括两种菜单项: 因为options menu在屏幕底部最多只能显示6个菜单项,这些菜单项称为icon menu,icon menu只支持文字(title) 以及icon,可以设置快捷键,不支持checkbox以及radio控件,所以不能设置checkable选项。 而多于6的菜单项会以“more” icon menu来调出,称为expanded menu。它不支持icon,其他的特性都和icon menu一样! 在Activity里面,一般通过以下函数来使用options menu: Activity::onCreateOptionsMenu (Menu menu) 创建options menu,这个函数只会在menu第一次显示时调用。 Activity::onPrepareOptionsMenu (Menu menu) 更新改变options menu的内容,这个函数会在menu每次显示时调用。 Activity::onOptionsItemSelected (MenuItem item) 处理选中的菜单项。 3. 上下文菜单 context menu 要在相应的view上按几秒后才显示的,用于view,跟某个具体的view绑定在一起。这类型的菜单不支持icon和快捷键! 在Activity里面,一般通过以下函数来使用context menu: Activity::registerForContextMenu(View view) 为某个view注册context menu,一般在Activity::onCreate里面调用。 Activity::onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 创建context menu,和options menu不同,context meun每次显示时都会调用这个函数。 Activity::onContextItemSelected(MenuItem item) 处理选中的菜单项。 4. 子菜单 以上两种menu(功能菜单和上下文菜单)都可以加入子菜单,但子菜单不能嵌套子菜单,这意味着在Android系统,菜单只有两层,设计时需要注意的!同时子菜单不支持icon(图标)。 5. 动态菜单 动态菜单就是根据不同的界面有不同的菜单。这时候就不再直接在xml里先定义好了,要在代码中动态添加菜单项。 在android中创建菜单menu时需要重写Activity的onCreateOptionsMenu(Menumenu)方法,在这个方法中实现菜单xml的关联。这个方法只在第一次创建的时候调用一次,所以如果之后想对menu进行动态的修改,那么就不能用它了。这时,就要用到onPrepareOptionsMenu(Menumenu)方法。 onPrepareOptionsMenu与onCreateOptionsMenu不同的是,他在每次按下menu硬键之前会被调用,所以可以在这里动态的改变menu。 代码中添加菜单项的方法:menu.add(groupId, itemId, order, title) groupld 这个菜单的组别 itemid 是用来获取这个指定菜单项的 order就是这个组别的第几项,0为第一项 title是显示的标题
我自己的一些感悟:{
一级菜单:(用html形式类似一下)
<menu>
<item>计算机系</item>
<item>艺术与设计系</item>
</menu>
二级菜单:(用html形式类似一下)
<menu>
<item>计算机系
<menu>
<item>软件技术专业</item>
<item>电子商务专业</item>
</menu>
</item>
<item>艺术与设计系</item>
</menu>
}{
实现菜单的三个方法
//初始化菜单 必须要 public boolean onCreateOptionsMenu(Menu menu){ getMenuInflater().inflate(R.menu.po,menu); return true; } //添加、更改 菜单 可以不要 public boolean onPrepareOptionsMenu(Menu menu){ String currentext=tv1.getText().toString(); if("软件技术".equals(currentext)){ menu.clear(); //清空菜单 menu.add(0,501,1,"软件1班"); menu.add(0,502,2,"软件2班"); menu.add(0,503,3,"软件3班"); menu.add(0,504,4,"转到计算机应用菜单"); } if("计算机应用".equals(currentext)){ menu.clear(); menu.add(0,601,1,"计应1班"); menu.add(0,602,2,"计应2班"); menu.add(0,603,3,"转到软件技术菜单"); } return super.onPrepareOptionsMenu(menu); } //选择菜单后的动作并关闭菜单 必须要 public boolean onOptionsItemSelected(MenuItem item){ int id=item.getItemId(); if(id==504){ tv1.setText("计算机应用"); return true; }else if(id==603){ tv1.setText("软件技术"); return true; } return super.onOptionsItemSelected(item); } }
里面menu.add(int,int,int,String);参数的意思
第一个int类型的group ID参数,代表的是组概念,你可以将几个菜单项归为一组,以便更好的以组的方式管理你的菜单按钮。必须有,但像菜单代码3一样,可以一样。
第二个int类型的item ID参数,代表的是项目编号。这个参数非常重要,一个item ID对应一个menu中的选项。在后面使用菜单的时候,就靠这个item ID来判断你使用的是哪个选项。这个必须有且每个item的ID不能相同。
第三个int类型的order ID参数,代表的是菜单项的显示顺序。默认是0,表示菜单的显示顺序就是按照add的显示顺序来显示。
第四个String类型的title参数,表示选项中显示的文字。
}{
敲完xml代码后,可以转到可视化界面看看,对应一下代码,可以很快就知道怎样可视化编辑菜单。
}
上一篇: 爆笑校园小幽默
下一篇: 浅谈javaScript内存