Android菜单栏,顺便通知一下

菜单Menu:

有三种菜单:(OptionsMenu选择菜单,ContextMenu上下文菜单,SubNenu子菜单),其中子菜单得和其他菜单一起使用。

三种菜单都有动态和静态的加载方法。方法都差不多

一.选择菜单OptionsMenu:

    静态加载:

            因为是静态加载,所有我们和前面的静态加载一理所当然创建一个xml文件。不够菜单的xml文件一般放在menu文件夹下,例子:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.z_menu.MainActivity" >
    <item
        android:id="@+id/item1"
        android:orderInCategory="100"
        android:title="发送通知"
        app:showAsAction="never"/>
    <item
        android:id="@+id/item2"
        android:orderInCategory="100"
        android:title="取消发送"
        app:showAsAction="never"/>
    <item
        android:id="@+id/item3"
        android:orderInCategory="100"
        android:title="没什么用"
        app:showAsAction="never"/>
</menu>

这个xml文件用了一个menu组件包含了三个item,菜单里面的选项都是item来的

其中app:showAsAction="never"的意思是菜单默认状态不显示

android:orderInCategory="100"表示iltem的优先级,值越大,优先级越低。

 

继续按照套路,有了布局文件,我们得把布局文件转换成View对象:getMenuInflater().inflate(R.menu.main, menu);

我们需要创建一个选择菜单栏,这需要我们重写Activity的onCreateOptionsMenu(Menu menu)方法,然后在创建菜单栏的时候导入布局文件的View对象。

public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

这样我们就可以显示选择菜单栏,接下来我们得实现菜单栏的点击事件,这需要我们重写Activity的onOptionsItemSelected();方法:

public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id){
        case R.id.item1 :
             Toast toast = Toast.makeText(MainActivity.this, "发送通知", Toast.LENGTH_SHORT);                    
             toast.show(); 
            break;
        case R.id.item2 :
             Toast toast2 = Toast.makeText(MainActivity.this, "取消发送", Toast.LENGTH_SHORT);                    
             toast2.show(); 
            break;
        case R.id.item3 :
             Toast toast3 = Toast.makeText(MainActivity.this, "没什么用", Toast.LENGTH_SHORT);                    
             toast3.show(); 
            break;
        }
        return super.onOptionsItemSelected(item);
    }
我们通过item.getItemId()获取被点击的item从而实现响应item的点击事件。

动态加载:
与静态加载类似,也是需要先在菜单创建的时候添加菜单内容,然后设置点击事件,不同的是静态是直接把xml加载进来,动态需要用menu的add()方法一项一项添加item。
public boolean onCreateOptionsMenu(Menu menu) {
        /**
         * menu.add(int groupId, int itemId, int order, String title);
         * groupId:子菜单的分组id
         * itemId:菜单里面的item的id
         * order:优先级
         * title:菜单里面的item的名字
         */
        menu.add(1, 1, 1, "发送通知");
        menu.add(1, 2, 1, "取消放送");
        menu.add(1, 3, 1, "没什么用");
        return true;
    }
public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id){
        case 1 :
             Toast toast = Toast.makeText(MainActivity.this, "发送通知", Toast.LENGTH_SHORT);                    
             toast.show(); 
            break;
        case 2 :
             Toast toast2 = Toast.makeText(MainActivity.this, "取消发送", Toast.LENGTH_SHORT);                    
             toast2.show(); 
            break;
        case 3 :
             Toast toast3 = Toast.makeText(MainActivity.this, "没什么用", Toast.LENGTH_SHORT);                    
             toast3.show(); 
            break;
        }
        return super.onOptionsItemSelected(item);
    }

注意这里的id不同的了!,如果想获得分组id,item有getGroundId()方法

 

二.子菜单SubMenu:

     两种加载方法和选择菜单大同小异,创建和响应菜单都是一样的方法

     静态加载:

            加载方法和选择菜单一样,不过不同的是xml文件不同:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.z_menu.MainActivity" >
    <item
        android:id="@+id/item1"
        android:orderInCategory="100"
        android:title="游戏"
        app:showAsAction="never">
        <menu >
             <item
                 android:id="@+id/item11"
                 android:orderInCategory="100"
                 android:title="LOL"
                 app:showAsAction="never"/>
             <item
                 android:id="@+id/item12"
                 android:orderInCategory="100"
                 android:title="DNF"
                 app:showAsAction="never"/>
             <item
                 android:id="@+id/item13"
                 android:orderInCategory="100"
                 android:title="阴阳师"
                 app:showAsAction="never"/>
        </menu>
    </item>
    <item
        android:id="@+id/item2"
        android:orderInCategory="100"
        android:title="食物"
        app:showAsAction="never">
        <menu >
            <item
                 android:id="@+id/item21"
                 android:orderInCategory="100"
                 android:title="巧克力"
                 app:showAsAction="never"/>
             <item
                 android:id="@+id/item22"
                 android:orderInCategory="100"
                 android:title="牛奶"
                 app:showAsAction="never"/>
             <item
                 android:id="@+id/item23"
                 android:orderInCategory="100"
                 android:title="蛋糕"
                 app:showAsAction="never"/>
        </menu>
    </item>
</menu>

    响应方法也是一样,判断item的id(注意是最里面的item的id没,例如item21)

    动态加载:

           选择菜单的添加是用add()方法直接添加的,我们这里只需要再加多一步添加子菜单就可以了,其他和选择菜单一样。

public boolean onCreateOptionsMenu(Menu menu) {
        SubMenu a = menu.addSubMenu("游戏");
        SubMenu b = menu.addSubMenu("食物");
        /**
         * menu.add(int groupId, int itemId, int order, String title);
         * groupId:子菜单的分组id
         * itemId:菜单里面的item的id
         * order:优先级
         * title:菜单里面的item的名字
         */
        a.add(1, 1, 1, "LOL");
        a.add(1, 2, 1, "DNF");
        a.add(1, 3, 1, "阴阳师");
        b.add(1, 4, 1, "巧克力");
        b.add(1, 5, 1, "牛奶");
        b.add(1, 6, 1, "蛋糕");
        return true;
    }

      响应方法一样,注意id是自定义的1,2,3 ...

 

三. 上下文菜单ConetxtMenu(这个菜单比较高大上)

      通常我们都是长按一个控件然后弹出这个菜单的:

      (!这里我们注意的是,这个菜单已经和上面两个不同了。构建方法不同,响应方法也不同。

             创建需要重写onCreateContextMenu()方法。响应是onContextItemSelected()方法。

             还需要注册上下文菜单registeterForContextMenu(View),里面的参数是长按这个View控件后出现这个注册的上下文菜单。

      套路。静态加载:

                       布局文件和选择菜单的一样。这里我们用一个ListView来注册实现上下文菜单。我们在Activity的布局文件中加一个ListView.加载号item和数据。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView) findViewById(R.id.lv);
        //添加数据源
        data = new ArrayList<String>();
        for(int n = 0; n<5; n++){
            data.add(n,"第"+String.valueOf(n+1)+"个item");
        }
        //加载适配器
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
        lv.setAdapter(adapter);
        //注册上下文菜单
        registerForContextMenu(lv);
    }

                      然后我们要构建上下文菜单,重写onCreateContextMenu()方法。

@Override
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
        // TODO Auto-generated method stub
        getMenuInflater().inflate(R.menu.main, menu);
        menu.setHeaderTitle("上下文菜单");//设置标题
        menu.setHeaderIcon(R.drawable.ic_launcher);//设置图片
        super.onCreateContextMenu(menu, v, menuInfo);
    }

                       接下来实现响应事件,重写onConetxtItemSelected()方法。

 

@Override
    public boolean onContextItemSelected(MenuItem item) {
        // TODO Auto-generated method stub
        int id = item.getItemId();
        switch (id){
        case R.id.item1 :
             Toast toast = Toast.makeText(MainActivity.this, "LOL", Toast.LENGTH_SHORT);                    
             toast.show(); 
            break;
        case R.id.item2:
             Toast toast2 = Toast.makeText(MainActivity.this, "DNF", Toast.LENGTH_SHORT);                    
             toast2.show(); 
            break;
        case R.id.item3:
             Toast toast3 = Toast.makeText(MainActivity.this, "阴阳师", Toast.LENGTH_SHORT);                    
             toast3.show(); 
            break;
        }
        return super.onContextItemSelected(item);
    }

 

               动态加载:(和选择菜单一样,onCreateContextMenu(Menu)方法中,用Menu.add()方法,响应也一样,注意id是自定义的id)

 

我们来顺便讲一下通知:

          通知:Notification (需要API 11以上)

                    通知是什么呢,通知就是我们手机平时在待机时候突然收到的app发来的提示消息,例如你在桌面的时候收到的微信通知。

                    通知包含什么呢!

                            图标:               setSmallIcon(图片);

                            手机状态提示:  setTicker(String string);

                            发送的时间:     setWhen(Date date);

                            标题:               setContextTitle(String string);

                            内容:                setContentText(String string);

                            点击后的意图:  setContentIntent(pending Intent);

                            提示:                setDefault(int ID);    

                    和我们的提示框一样,创建上面这些属性我们需要一个构建对象,通知构建函数Notification.Builder.

                    然后我们通过通知管理对象NotificationManager.

                    提示记得设置权限

                   

 

 

private NotificationManager manger = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

public void setNotification(){
        Notification.Builder builder = new Notification.Builder(MainActivity.this);
           builder.setSmallIcon(R.drawable.ic_launcher);//设置图标
           builder.setTicker("你有通知!");//设置手机状态提示
           builder.setWhen(System.currentTimeMillis());//设置时间,系统当前时间
           builder.setContentTitle("通知");//设置标题
           builder.setContentText("快点来点我");//设置内容
           /**
            * Notification.DEFAULT_LIGHTS;提示灯
            * Notification.DEFAULT_SOUND;提示声
            * Notification.DEFAULT_VIBRATE;震动
            */
           builder.setDefaults(Notification.DEFAULT_ALL);//包含上面所有,记得设置权限。
           Intent intent = new Intent(MainActivity.this,MainActivity.class);
           /**
            * PendingIntent.getActivity(Context context, int  requestCode, Intent intent, int flags)
            */
           PendingIntent pending = PendingIntent.getActivity(MainActivity.this,0, intent, 0);
           builder.setContentIntent(pending);//设置意图
           //Notification notification = builder.build();//4.1以上
           Notification notification = builder.getNotification();//以下,当前是API11
           manger.notify(1, notification);//发送通知前面是通知的编码,这一取消才知道取消哪一个通知
    }

manger.cancel(1);//取消发送

接下来给一个示例来总结今天的内容:

public class MainActivity extends ActionBarActivity {
    private ListView lv ;
    private ArrayList<String> data;
    private ArrayAdapter<String> adapter;
    private NotificationManager manger;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView) findViewById(R.id.lv);
        //添加数据源
        data = new ArrayList<String>();
        for(int n = 0; n<5; n++){
            data.add(n,"第"+String.valueOf(n+1)+"个item");
        }
        //加载适配器
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data);
        lv.setAdapter(adapter);
        //注册上下文菜单
        registerForContextMenu(lv);
        manger = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //getMenuInflater().inflate(R.menu.main, menu);//静态加载
        SubMenu a = menu.addSubMenu("游戏");
        SubMenu b = menu.addSubMenu("食物");
        /**
         * menu.add(int groupId, int itemId, int order, String title);
         * groupId:子菜单的分组id
         * itemId:菜单里面的item的id
         * order:优先级
         * title:菜单里面的item的名字
         */
        a.add(1, 1, 1, "LOL");
        a.add(1, 2, 1, "DNF");
        a.add(1, 3, 1, "阴阳师");
        b.add(1, 4, 1, "巧克力");
        b.add(1, 5, 1, "牛奶");
        b.add(1, 6, 1, "蛋糕");
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id){
        case 1 :
             Toast toast = Toast.makeText(MainActivity.this, "LOL", Toast.LENGTH_SHORT);                    
             toast.show(); 
            break;
        case 2 :
             Toast toast2 = Toast.makeText(MainActivity.this, "DNF", Toast.LENGTH_SHORT);                    
             toast2.show(); 
            break;
        case 3 :
             Toast toast3 = Toast.makeText(MainActivity.this, "阴阳师", Toast.LENGTH_SHORT);                    
             toast3.show(); 
            break;
        case 4 :
            Toast toast4 = Toast.makeText(MainActivity.this, "巧克力", Toast.LENGTH_SHORT);                    
             toast4.show(); 
             break;
        case 5 :
            Toast toast5 = Toast.makeText(MainActivity.this, "牛奶", Toast.LENGTH_SHORT);                    
             toast5.show(); 
               break;
        case 6 :
            Toast toast6 = Toast.makeText(MainActivity.this, "蛋糕", Toast.LENGTH_SHORT);                    
             toast6.show(); 
            break;
        }
        return super.onOptionsItemSelected(item);
    }
    
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
        //getMenuInflater().inflate(R.menu.main, menu);//静态加载
        menu.setHeaderTitle("上下文菜单");//设置标题
        menu.setHeaderIcon(R.drawable.ic_launcher);//设置图片
        menu.add(1, 1, 1, "发送通知");
        menu.add(1, 2, 1, "取消发送");
        menu.add(1, 3, 1, "没上面用");
        super.onCreateContextMenu(menu, v, menuInfo);
    }
    
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        int id = item.getItemId();
        switch (id){
        case 1 :
            setNotification();
            break;
        case 2:
            manger.cancel(1);//取消发送
            Toast toast = Toast.makeText(MainActivity.this, "通知已取消", Toast.LENGTH_SHORT);                    
            toast.show();
            break;
        case 3:
             Toast toast1 = Toast.makeText(MainActivity.this, "都说没用还按", Toast.LENGTH_SHORT);                    
             toast1.show(); 
            break;
        }
        return super.onContextItemSelected(item);
    }
    
    public void setNotification(){
        Notification.Builder builder = new Notification.Builder(MainActivity.this);
           builder.setSmallIcon(R.drawable.ic_launcher);//设置图标
           builder.setTicker("你有通知!");//设置手机状态提示
           builder.setWhen(System.currentTimeMillis());//设置时间,系统当前时间
           builder.setContentTitle("通知");//设置标题
           builder.setContentText("快点来点我");//设置内容
           /**
            * Notification.DEFAULT_LIGHTS;提示灯
            * Notification.DEFAULT_SOUND;提示声
            * Notification.DEFAULT_VIBRATE;震动
            */
           builder.setDefaults(Notification.DEFAULT_ALL);//包含上面所有,记得设置权限。
           Intent intent = new Intent(MainActivity.this,MainActivity.class);
           /**
            * PendingIntent.getActivity(Context context, int  requestCode, Intent intent, int flags)
            */
           PendingIntent pending = PendingIntent.getActivity(MainActivity.this,0, intent, 0);
           builder.setContentIntent(pending);//设置意图
           //Notification notification = builder.build();//4.1以上
           Notification notification = builder.getNotification();//以下,当前是API11
           manger.notify(1, notification);//发送通知前面是通知的编码,这一取消才知道取消哪一个通知
    }
}

   

   

   

   

 

 

如果有什么错误,或者我理解错误或不当的,恳请大家纠正,谢谢!嘻嘻嘻~~~

posted on 2017-03-11 16:05  艹艹哒丶  阅读(1331)  评论(0编辑  收藏  举报

导航