今天在學習在ActionBar上添加分享功能時,按照文檔的寫法,報了一個錯誤Exception: This is not supported, use MenuItemCompat.getActionProvider()
java
下面是我抄來的代碼:android
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:app
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; } }
若是這樣直接運行起來,會報錯,報錯內容以下:ide
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();
oop
在這裏取這個ShareActionProvider出現問題。學習
這裏要注意的幾個地方:spa
android:actionProviderClass="android.widget.ShareActionProvider"
使用的不是support的類class MainActivity extends AppCompatActivity
使用的是v7中的AppCompatActivityandroid.widget.ShareActionProvider
問題有兩個code
item.getActionProvider()
。由於這個方法在API Level 10及以前是不安全的。須要使用MenuItemCompat.getActionProvider(item)修改後的menu_main.xml: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; } }