轉載請註明出處: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