android中选中菜单的显示跳转和隐式跳转的实例介绍

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

简介

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。有意思的是下面这几句代码:

复制代码 代码如下:

Intent intent = new Intent(null, getIntent().getData());

        intent.addCategory(Intent.CATEGORY_ALTERNATIVE);

        menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0,

                new ComponentName(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,没有什么功能,就是表现一个界面。

复制代码 代码如下:

public class HelloAndroid extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        this.setContentView(R.layout.main);

    }

}      

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

复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns: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"/>

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

</LinearLayout>    

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

复制代码 代码如下:

<activity android:name="HelloAndroid" android:label="@string/txtInfo">

            <intent-filter>

                <action android:name="com.android.notepad.action.HELLO_TEST" />

                <category android:name="android.intent.category.ALTERNATIVE"/>

                <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />

            </intent-filter>

        </activity>

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

复制代码 代码如下:

Intent intent = new Intent(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的劳功了。

复制代码 代码如下:

Uri uri = ContentUris.withAppendedId(getIntent().getData(), getSelectedItemId());   

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

复制代码 代码如下:

Intent[] specifics = new Intent[1];

            specifics[0] = new Intent(Intent.ACTION_EDIT, uri);

            MenuItem[] items = new MenuItem[1];   

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

复制代码 代码如下:

Intent intent = new Intent(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

    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {

        case MENU_ITEM_INSERT:

            // Launch activity to insert a new item

            startActivity(new Intent(Intent.ACTION_INSERT, getIntent().getData()));

            return true;

        }

        return super.onOptionsItemSelected(item);

    }   

Context Menu

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

复制代码 代码如下:

Cursor cursor = (Cursor) getListAdapter().getItem(info.position);

        if (cursor == null) {

            // For some reason the requested item isn't available, do nothing

            return;

        }   

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

复制代码 代码如下:

// Setup the menu header

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

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

复制代码 代码如下:

// Add a menu item to delete the note

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

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

复制代码 代码如下:

switch (item.getItemId()) {

            case MENU_ITEM_DELETE: {

                // Delete the note that the context menu is for

                Uri noteUri = ContentUris.withAppendedId(getIntent().getData(), info.id);

                getContentResolver().delete(noteUri, null, null);

                return true;

            }

        }

        return false;

}

对于日记的除删,首先用调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函数中加增一个理处进程:

复制代码 代码如下:

case MENU_ITEM_INSERT:

            {

                new AlertDialog.Builder(this).setIcon(R.drawable.app_notes)

                .setTitle(R.string.app_name).setMessage(R.string.error_message).setPositiveButton(R.string.button_ok, new OnClickListener(){

public void onClick(DialogInterface dialog, int which) {

                        // TODO Auto-generated method stub

}

}).show();

                return true;

            }

验实结果如下:

时间: 2024-10-28 12:22:30

android中选中菜单的显示跳转和隐式跳转的实例介绍的相关文章

android中的显示跳转和隐式跳转

简介 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

关于显示跳转和隐式跳转问题

问题描述 android支持两种跳转模式,一种比如:Intent eulaIntent = new Intent(this, xxx.class); 另一种比如:Intent intent = new Intent(Intent.ACTION_INSERT, getIntent().getData());虽然这两种都能用,但是我觉得第一种更简单,快速,但是看了很多官方的demo都是用第二种来实现跳转,通过匹配intent-filter<action android:name="androi

android--显式跳转和隐式跳转的区别用法

#创建第二个activity* 新创建的activity,必须在清单文件中做配置,否则系统找不到,在显示时会直接报错 <activity android:name="com.itheima.createactivity.SecondActivity"></activity>* 只要有以下代码,那么就是入口activity,就会生成快捷图标 <intent-filter>                <action android:name=&

android--显式跳转和隐式跳转

区别如下: 显式启动Activity指的是在Intent内部直接声明要启动的activity所对应的class. 隐式启动Activity的intent到底发给哪个activity,需要进行三个匹配,一个是action, 一个是category,一个是data,可以是全部或部分匹配,同样适用于Service和BroadcastReceiver. A:显式启动 下面用代码来解释什么是显式启动. [java] view plain copy    print? Intent intent=new I

Android 中 Activity显示隐式跳转

安卓中经常涉及到activity的跳转,跳转怎么样在安卓中实现呢,如下. 创建第二个activity就是创建一个class,继承自Android.app.Activity. 创建第二个activity的同时需要在清单文件中配置,不然会找不到 <activity android:name="com.ldw.createActivity.SecondActivity"></activity> 入口activity有下面的代码,只要activity有下面的代码,就会创

设置宽度-Android中使用mupdf横屏显示pdf时将pdf缩放了,哪位大神用过这个库?

问题描述 Android中使用mupdf横屏显示pdf时将pdf缩放了,哪位大神用过这个库? 在横屏阅读pdf时,将pdf纵向的缩小显示了整个pdf.但是现在要的效果就是横屏的时候让pdf的宽达到横屏时候的宽,(目前是横向滑动的)高度可以上下来回拖!可以两根手指放大之类的效果,请问有哪位大神用过这个pdf,如何设置初始时候的画面大小啊,求大神解答,在线等!!! 解决方案 使用skia库生成pdf文件 解决方案二: 我的Mupdf嵌到项目中总是出错,是不是需要NDK编译啊,求指点:22313717

android开发-关于android中listview里面textview显示混乱

问题描述 关于android中listview里面textview显示混乱 哪位大神能帮我解决下面代码中的listview里面textview的显示混乱问题 纠结好久了 谢谢 复制可以直接执行 源文件: package com.example.listviewtest; import java.util.ArrayList; import android.os.Bundle; import android.app.Activity; import android.view.LayoutInfla

Android学习之Intent中显示意图和隐式意图的用法实例分析_Android

本文实例讲述了Android学习之Intent中显示意图和隐式意图的用法.分享给大家供大家参考,具体如下: Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用. 因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦. 例如,在一个联系人

Android中实现EditText密码显示隐藏的方法

在Google发布了support:design:23+以后我们发现有这么一个东西TextInputLayout,先看下效果图: <android.support.design.widget.TextInputLayout android:id="@+id/pwdLayout" android:layout_width="match_parent" android:layout_height="wrap_content" app:passw