1. 程式人生 > 其它 >Exception: This is not supported, use MenuItemCompat.getActionProvider()的處理

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

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

今天在學習在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

問題有兩個

  1. 使用v7包中的ActionBar,就要使用v7包中的ShareActionProvider,或者都使用原生的ActionBar,兩者要一致
  2. 如果使用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;
    }
}

轉載於:https://my.oschina.net/neumeng/blog/744018