• 【凯子哥带你夯实应用层】使用ActionProvider实现子菜单时遇到的一个坑


        转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 

        近期在重温Android基础。在看到ActionProvider的时候遇到一个坑。分享到大家,避免入坑。

        首先简介下ActionProvider。

        ShareActionProvider你应该用过吧?就是使用系统自带的分享功能,事实上ShareActionProvider就是ActionProvider的一个子类,能够在ActionBar上面显示为一个MenuItem,可是我们能够自己定义事件行为,所以我们能够通过继承ActionProvider实现微信子菜单的效果,像以下这样



        关于基础使用方法。我不再说明,大家能够參考郭神的文章http://blog.csdn.net/guolin_blog/article/details/25466665 

        咱们重点介绍下我遇到的坑。

        

        问题描写叙述:用appcompat-support-v7:22.0.0,support-v4:22.0.0兼容包。出现ActionProvider不能显示的问题。

        问题原因:使用兼容包导致的import和xml的命名空间不一致    

        正确写法:

        特别注意ActionProvider一定要使用v4兼容包里面的

    import android.content.Context;
    import android.support.v4.view.ActionProvider;
    import android.view.MenuItem;
    import android.view.SubMenu;
    import android.view.View;
    
    /**
     * Created by zhaokaiqiang on 15/3/18.
     */
    public  class MyActionProvider extends ActionProvider {
    
    	private Context context;
    
    	public MyActionProvider(Context context) {
    		super(context);
    		this.context = context;
    	}
    
    	@Override
    	public View onCreateActionView() {
    		return null;
    	}
    
    	@Override
    	public void onPrepareSubMenu(SubMenu subMenu) {
    
    		subMenu.clear();
    		subMenu.add("sub item 1").setIcon(R.mipmap.ic_launcher)
    				.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    					@Override
    					public boolean onMenuItemClick(MenuItem item) {
    						return true;
    					}
    				});
    		subMenu.add("sub item 2").setIcon(R.mipmap.ic_launcher)
    				.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
    					@Override
    					public boolean onMenuItemClick(MenuItem item) {
    						return false;
    					}
    				});
    
    	}
    
    	@Override
    	public boolean hasSubMenu() {
    		return true;
    	}
    }
    
       

        还要注意在menu的xml中,要使用app的命名空间,例如以下,假设要使用android:命名空间,程序不会报错。可是子菜单也显示不出来。郁闷死咯

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
        >
    
        <item
            android:id="@+id/action_search"
            android:icon="@android:drawable/ic_menu_search"
            android:actionViewClass="android.widget.SearchView"
            app:showAsAction="ifRoom|collapseActionView"
            android:title="搜索"/>
    
        <item
            android:id="@+id/action_add"
            android:icon="@android:drawable/ic_menu_add"
            android:title="add"
            app:showAsAction="ifRoom"
            app:actionProviderClass="com.socks.uidemo.MyActionProvider"
            />
    
    </menu>

        假设我们使用app:命名空间。可是使用的不是v4包里面的,那么就会报错,例如以下



        这个问题在stackoverflow中得解决方式例如以下,可是试过,不起作用,和咱们遇到的兼容包问题不属于一个

        http://stackoverflow.com/questions/19439106/cant-display-sub-menu-for-custom-actionprovider


  • 相关阅读:
    Python系列:四、Python函数--技术流ken
    Centos7破解密码的两种方法--技术流ken
    Python系列:三、流程控制循环语句--技术流ken
    Python系列:二、数据类型--技术流ken
    Python系列:一、Python概述与环境安装--技术流ken
    zabbix实现百台服务器的自动化监控--技术流ken
    学会这个删库再也不用跑路了~ --技术流ken
    五分钟彻底学会iptables防火墙--技术流ken
    Docker之使用Dockerfile创建定制化镜像(四)--技术流ken
    Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7225757.html
Copyright © 2020-2023  润新知