查了好多资料,现发还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!

简介

android供给了三种菜单类型,分别为options menu,context menu,sub menu。

options menu就是通过按home键来表现,context menu需要在view上按上2s后表现。这两种menu都有可以参加子菜单,子菜单不能种不能嵌套子菜单。options menu最多只能在幕屏最下面表现6个菜单项选,称为iconmenu,icon menu不能有checkable项选。多于6的菜单项会以more icon menu来调出,称为expanded menu。options menu通过activity的onCreateOptionsMenu来生成,这个函数只会在menu第一次生成时用调。任何想转变options menu的设法只能在onPrepareOptionsMenu来现实,这个函数会在menu表现前用调。onOptionsItemSelected 用来理处选中的菜单项。

context menu是跟某个体具的view绑定在一起,在activity种用registerForContextMenu来为某个view注册context menu。context menu在表现前都市用调onCreateContextMenu来生成menu。onContextItemSelected用来理处选中的菜单项。

android还供给了对菜单项行进分组的功能,可以把似相功能的菜单项分红同一个组,这样以可就通过用调setGroupCheckable,setGroupEnabled,setGroupVisible来设置菜单属性,而无须独单设置。

Options Menu

Notepad中使用了options menu和context menu两种菜单。首先来看生成options menu的onCreateOptionsMenu函数。

menu.add(0,MENU_ITEM_INSERT,0,R.string.menu_insert)
.setShortcut(
'3','a')
.setIcon(android.R.drawable.ic_menu_add);

这是一个标准的插入一个菜单项的方法,菜单项的id为MENU_ITEM_INSERT。有意思的是下面这几句代码:

Intentintent=newIntent(null,getIntent().getData());
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE,
0,0,
newComponentName(this,NotesList.class),null,intent,0,null);

这到底有何处用呢?其实这是一种态动菜单技巧(也有点像件插机制),若某一个activity,其类型是”android.intent.category.ALTERNATIVE”,据数是”vnd.android.cursor.dir/vnd.google.note”的话,系统就会为这个activity加增一个菜单项。在androidmanfest.xml中查看后现发,没有一个activity符合条件,所以这段代码并没有态动添加出任何一个菜单项。

为了验证上述分析,我们可以来做一个验实,在androidmanfest.xml中行进修改,看否是会态动生成出菜单项。

验实一

首先我们来建创一个新的activity作为目标activity,名为HelloAndroid,没有什么功能,就是表现一个界面。

publicclassHelloAndroidextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
this.setContentView(R.layout.main);
}
}

它所对应的局布界面XML文件如下:

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="fill_parent"
android:layout_height
="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height
="wrap_content"android:id="@+id/TextView01"/>

<Buttonandroid:id="@+id/Button01"android:layout_height="wrap_content"android:layout_width="fill_parent"android:text="@string/txtInfo"></Button>
</LinearLayout>

然后修改androidmanfest.xml,参加下面这段配置,让HelloAndroid满意上述两个条件:

<activityandroid:name="HelloAndroid"android:label="@string/txtInfo">
<intent-filter>
<actionandroid:name="com.android.notepad.action.HELLO_TEST"/>
<categoryandroid:name="android.intent.category.ALTERNATIVE"/>
<dataandroid:mimeType="vnd.android.cursor.dir/vnd.google.note"/>
</intent-filter>
</activity>

好了,行运下试试,哎,还是没有态动菜单项参加呀!怎么回事呢?查看代码后现发,原来是onPrepareOptionsMenu弄的鬼!这个函数在onCreateOptionsMenu后之行运,下面这段代码中,由于Menu.CATEGORY_ALTERNATIVE是指向同一个组,所以把onCreateOptionsMenu中设置的菜单项给盖覆掉了,而由于onPrepareOptionsMenu没有给Menu.CATEGORY_ALTERNATIVE附新值,故Menu.CATEGORY_ALTERNATIVE还是为空。

Intentintent=newIntent(null,uri);
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE,
0,0,null,specifics,intent,0,items);

好的,那我们临时把下面这几句给释注掉,当然,也可以不释注这几句,在onCreateOptionsMenu中改groupid号,即将Menu.CATEGORY_ALTERNATIVE为改Menu.first,其他的也行,但意注不要为改menu.none,这样会盖覆掉

menu.add(0,MENU_ITEM_INSERT,0,R.string.menu_insert)
.setShortcut(
'3','a')
.setIcon(android.R.drawable.ic_menu_add);

添加的菜单。因为menu.none也为0。行运后以可就看到态动菜单出来了!

下面这个options menu是在NotesList界面上没有日记列表选中的情况下生成的,若先选中一个日记,然后再点”menu”,则生成的options menu是下面这样的:

每日一道理
一个安静的夜晚,我独自一人,有些空虚,有些凄凉。坐在星空下,抬头仰望美丽天空,感觉真实却由虚幻,闪闪烁烁,似乎看来还有些跳动。美的一切总在瞬间,如同“海市蜃楼”般,也只是刹那间的一闪而过,当天空变得明亮,而这星星也早已一同退去……

哎,又态动加增了两个菜单项”Edit note”和”Edit title”,这又是如何态动参加的呢?这就是onPrepareOptionsMenu的劳功了。

Uriuri=ContentUris.withAppendedId(getIntent().getData(),getSelectedItemId());

首先获得选中的日记(若没有择选,则uri为空)

Intent[]specifics=newIntent[1];
specifics[
0]=newIntent(Intent.ACTION_EDIT,uri);
MenuItem[]items
=newMenuItem[1];

然后为选中的日记建创一个intent,操纵类型为Intent.ACTION_EDIT,据数为选中日记的URI.于是会为选中的日记建创一个”Edit note”菜单项。

Intentintent=newIntent(null,uri);
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE,
0,0,null,specifics,intent,0,
items);

这几句和下面onCreateOptionsMenu函数中似类,于用态动加增菜单项,若某一个activity,其类型是”android.intent.category.ALTERNATIVE”,据数是”vnd.android.cursor.item/vnd.google.note”的话,系统就会为这个activity加增一个菜单项。在androidmanfest.xml中查看后现发,TitleEditor这个activity符合条件,于是系统就为TitleEditor这个activity态动添加一个菜单项”Edit title”

else{
menu.removeGroup(Menu.CATEGORY_ALTERNATIVE);
}

若日记列表为空,则从菜单中除删组号为Menu.CATEGORY_ALTERNATIVE的菜单项,只剩下”Add note”菜单项。

理处“选中菜单项”事件

菜单项选中事件的理处非常简略,通过onOptionsItemSelected来成完,这里只是简略地用调startActivity(new Intent(Intent.ACTION_INSERT, getIntent().getData()));这个intent的操纵类型为Intent.ACTION_INSERT,据数为日记列表的URI,即”content:// com.google.provider.NotePad/notes”

@Override
publicbooleanonOptionsItemSelected(MenuItemitem){
switch(item.getItemId()){
caseMENU_ITEM_INSERT:
//Launchactivitytoinsertanewitem
startActivity(newIntent(Intent.ACTION_INSERT,getIntent().getData()));
returntrue;
}
returnsuper.onOptionsItemSelected(item);
}

Context Menu

下面分析另一种菜单---上下文菜单,这通过重载onCreateContextMenu函数现实。首先确认已选中了日记列表中的一个日记,若没择选,则直接返回。Cursor指向选中的日记项。

Cursorcursor=(Cursor)getListAdapter().getItem(info.position);
if(cursor==null){
//Forsomereasontherequesteditemisn'tavailable,donothing
return;
}

然后,设置上下文菜单的标题为日记标题

//Setupthemenuheader
menu.setHeaderTitle(cursor.getString(COLUMN_INDEX_TITLE));

最后为上下文菜单加增一个菜单项

//Addamenuitemtodeletethenote
menu.add(0,MENU_ITEM_DELETE,0,R.string.menu_delete);

对于上下文菜单项选中的事件理处,是通过重载onContextItemSelected现实的。

switch(item.getItemId()){
caseMENU_ITEM_DELETE:{
//Deletethenotethatthecontextmenuisfor
UrinoteUri=ContentUris.withAppendedId(getIntent().getData(),info.id);
getContentResolver().delete(noteUri,
null,null);
returntrue;
}
}
returnfalse;
}

对于日记的除删,首先用调ContentUris.withAppendedId(getIntent().getData(), info.id);来接拼出待除删日记的URI.然后getContentResolver().delete(noteUri, null, null);用调层下的Content Provider去除删此日记。

验实二

来做个简略验实,在上述代码基础上加增一个上下文菜单项。首先在onCreateContextMenu函数中加增一个上下文菜单项:

menu.add(0,MENU_ITEM_INSERT,0,R.string.menu_insert);

然后为其在onContextItemSelected函数中加增一个理处进程:

caseMENU_ITEM_INSERT:
{
newAlertDialog.Builder(this).setIcon(R.drawable.app_notes)
.setTitle(R.string.app_name).setMessage(R.string.error_message).setPositiveButton(R.string.button_ok,
newOnClickListener(){

publicvoidonClick(DialogInterfacedialog,intwhich){
//TODOAuto-generatedmethodstub

}

}).show();
returntrue;
}

验实结果如下:


文章结束给大家分享下程序员的一些笑话语录: 火车
一个年轻的程序员和一个项目经理登上了一列在山里行驶的火车,他们发现 列车上几乎都坐满了,只有两个在一起的空位,这个空位的对面是一个老奶 奶和一个年轻漂亮的姑娘。两个上前坐了下来。程序员和那个姑娘他们比较 暧昧地相互看对方。这时,火车进入山洞,车厢里一片漆黑。此时,只听见 一个亲嘴的声音,随后就听到一个响亮的巴掌声。很快火车出了山洞,他们 四个人都不说话。
那个老奶奶在喃喃道, “这个年轻小伙怎么这么无礼, 不过我很高兴我的孙女 扇了一个巴掌”。
项目经理在想,“没想到这个程序员居然这么大胆,敢去亲那姑娘,只可惜那 姑娘打错了人,居然给打了我。”
漂亮的姑娘想,“他亲了我真好,希望我的祖母没有打疼他”。
程序员坐在那里露出了笑容, “生活真好啊。 这一辈子能有几次机会可以在亲 一个美女的同时打项目经理一巴掌啊”

更多相关文章

  1. C语言函数的递归(上)
  2. ViewPager+Fregment布局滑动
  3. ym——Android从零开始(5)(文件操作+日记+单元测试)(新)
  4. 【Android】自定义View
  5. Android在标准linux基础上对休眠唤醒的实现(二)
  6. Android(安卓)5.1 SurfaceFlinger VSYNC详解
  7. Android的MediaPlayer
  8. Linux Kernel and Android(安卓)休眠与唤醒
  9. Android网络状态实时监听实例代码(二)

随机推荐

  1. Android(安卓)实用工具Hierarchy Viewer
  2. Android的线程和线程池
  3. 学习android心里旅程
  4. 基于android的音乐APP大作业和设计指导项
  5. 同样的互联网大环境下,你连工作都找不到,年
  6. Android中的UI界面控制方式和自定义View
  7. 实现类似android:clipChildren="false"的
  8. Android遍历API (1) 动画篇——克隆动画A
  9. Cordova + vue 打包安卓(Android) apk 及
  10. 谁告诉你鸿蒙(HarmonyOS)不能在macOS下玩,一