您的位置:首页 > 产品设计 > UI/UE

Exception: This is not supported, use MenuItemCompat.getActionProvider()的处理

2016-09-08 08:55 288 查看
今天在学习在ActionBar上添加分享功能时,按照文档的写法,报了一个错误
Exception: This is not supported, use MenuItemCompat.getActionProvider()


下面是我抄来的代码:

menu_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_item_share"
android:actionProviderClass="android.widget.ShareActionProvider"
android:title="Share"
app:showAsAction="ifRoom" />
</menu>

MainActivity.java:

package com.neumeng.actionbarsharedemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ShareActionProvider;

public class MainActivity extends AppCompatActivity {
private ShareActionProvider mShareActionProvider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate menu resource file.
getMenuInflater().inflate(R.menu.menu_main, menu);

// Locate MenuItem with ShareActionProvider
MenuItem item = menu.findItem(R.id.menu_item_share);

// Fetch and store ShareActionProvider
mShareActionProvider = (ShareActionProvider) item.getActionProvider();

// Return true to display menu
return true;
}
}

如果这样直接运行起来,会报错,报错内容如下:

java.lang.UnsupportedOperationException: This is not supported, use MenuItemCompat.getActionProvider()
at android.support.v7.view.menu.MenuItemImpl.getActionProvider(MenuItemImpl.java:644)
at com.neumeng.actionbarsharedemo.MainActivity.onCreateOptionsMenu(MainActivity.java:25)
at android.app.Activity.onCreatePanelMenu(Activity.java:2846)
at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:360)
at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:88)
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:328)
at android.support.v7.app.AppCompatDelegateImplV9.preparePanel(AppCompatDelegateImplV9.java:1353)
at android.support.v7.app.AppCompatDelegateImplV9.doInvalidatePanelMenu(AppCompatDelegateImplV9.java:1633)
at android.support.v7.app.AppCompatDelegateImplV9.access$100(AppCompatDelegateImplV9.java:93)
at android.support.v7.app.AppCompatDelegateImplV9$1.run(AppCompatDelegateImplV9.java:132)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

MainActivity中的第25行是:
mShareActionProvider = (ShareActionProvider) item.getActionProvider();


在这里取这个ShareActionProvider出现问题。

这里要注意的几个地方:

在memu配置文件里,
android:actionProviderClass="android.widget.ShareActionProvider"
使用的不是support的类

在MainActivity中,
class MainActivity extends AppCompatActivity
使用的是v7中的AppCompatActivity

在MainActivity中,mShareActionProvider成员变量是
android.widget.ShareActionProvider


问题有两个

使用v7包中的ActionBar,就要使用v7包中的ShareActionProvider,或者都使用原生的ActionBar,两者要一致

如果使用v7包中的ActioBar,就不能使用
item.getActionProvider()
。因为这个方法在API Level 10及之前是不安全的。需要使用MenuItemCompat.getActionProvider(item)

修改后的menu_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_item_share"
android:title="Share"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
app:showAsAction="ifRoom" />

</menu>

修改后的MainActivity.java:

package com.neumeng.actionbarsharedemo;

import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.support.v7.widget.ShareActionProvider;

public class MainActivity extends AppCompatActivity {
private ShareActionProvider mShareActionProvider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate menu resource file.
getMenuInflater().inflate(R.menu.menu_main, menu);

// Locate MenuItem with ShareActionProvider
MenuItem item = menu.findItem(R.id.menu_item_share);

// Fetch and store ShareActionProvider
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);

// Return true to display menu
return true;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android ActionBar
相关文章推荐