【凱子哥帶你夯實應用層】使用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


發佈了130 篇原創文章 · 獲贊 129 · 訪問量 148萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章