exception:这不支持,使用MenuItemCompat.getActionProvider()

我正在尝试在Android应用程序的Action Bar中创build“分享”button。 在这里我的代码:

import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.ActionBarActivity; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ShareActionProvider; import android.widget.TextView; 

和片段部分:

 { private String mForecastText; public PlaceholderFragment() { setHasOptionsMenu(true); } private Intent sharedIntentMaker(){ Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); shareIntent.setType("text/plain"); shareIntent.putExtra(Intent.EXTRA_TEXT, mForecastText + "#SunshineApp"); return shareIntent; } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_detail, menu); MenuItem menuItem = menu.findItem(R.id.menu_action_share); ShareActionProvider mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider(); mShareActionProvider.setShareIntent(sharedIntentMaker()); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_detail, container, false); TextView textIntent = (TextView) rootView.findViewById(R.id.textIntent); Intent intent = getActivity().getIntent(); mForecastText = intent.getStringExtra("INT_PS"); textIntent.setText(mForecastText); return rootView; } 

当我在模拟器甚至真正的设备上运行我的应用程序时,我得到exception:

 AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.UnsupportedOperationException: This is not supported, use MenuItemCompat.getActionProvider() 

并链接到onCreateOptionsMenu()的string:

 ShareActionProvider mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider(); mShareActionProvider.setShareIntent(sharedIntentMaker()); 

我做错了什么?

PS:从logcat的错误Stacktrace:

01-11 13:03:17.490 2331-2331 / com。*****。*****。***** E / AndroidRuntime:FATAL EXCEPTION:main Process:com。*****。* ****。*****,PID:2331

 java.lang.UnsupportedOperationException: This is not supported, use MenuItemCompat.getActionProvider() at android.support.v7.internal.view.menu.MenuItemImpl.getActionProvider(MenuItemImpl.java:645) at com.project.malina.sunsine.DetailActivity$PlaceholderFragment.onCreateOptionsMenu(DetailActivity.java:70) at android.support.v4.app.Fragment.performCreateOptionsMenu(Fragment.java:1868) at android.support.v4.app.FragmentManagerImpl.dispatchCreateOptionsMenu(FragmentManager.java:1989) at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:276) at android.support.v7.app.ActionBarActivity.superOnCreatePanelMenu(ActionBarActivity.java:276) at android.support.v7.app.ActionBarActivityDelegate$1.onCreatePanelMenu(ActionBarActivityDelegate.java:79) at android.support.v7.app.ActionBarActivityDelegateBase.preparePanel(ActionBarActivityDelegateBase.java:979) at android.support.v7.app.ActionBarActivityDelegateBase.doInvalidatePanelMenu(ActionBarActivityDelegateBase.java:1182) at android.support.v7.app.ActionBarActivityDelegateBase.access$100(ActionBarActivityDelegateBase.java:79) at android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.java:115) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5221) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 

Solutions Collecting From Web of "exception:这不支持,使用MenuItemCompat.getActionProvider()"

首先,你不能使用android.widget.ShareActionProviderappcompat-v7动作栏的backport(例如, ActionBarActivity )。 使用appcompat-v7版本,或将所有内容移到本机操作栏。

其次,如果你坚持使用appcompat-v7 ,那么你不能安全地使用getActionProvider() ,因为这个方法在API级别10和下面不存在。 用MenuItemCompat.getActionProvider(menuItem)replacemenuItem.getActionProvider() MenuItemCompat.getActionProvider(menuItem)

FWIW, 这是一个示例项目 ,它实现了appcompat-v7版本。

您可以按照下面链接中的Google代码示例中的模式进行操作。 https://github.com/googlesamples/android-ActionBarCompat-ShareActionProvider

最简单的方法是去你的Android Studio =>文件,导入示例。 然后input“Share Action Provider”。

在这里输入图像说明

以下是创buildShareActionProvider与ActionBarCompat共享操作菜单项的代码,向后兼容API v7。

MainActivity.java

 // BEGIN_INCLUDE(get_sap) @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu resource getMenuInflater().inflate(R.menu.main_menu, menu); // Retrieve the share menu item MenuItem shareItem = menu.findItem(R.id.menu_share); // Now get the ShareActionProvider from the item mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem); // Get the ViewPager's current item position and set its ShareIntent. int currentViewPagerItem = ((ViewPager) findViewById(R.id.viewpager)).getCurrentItem(); setShareIntent(currentViewPagerItem); return super.onCreateOptionsMenu(menu); } // END_INCLUDE(get_sap private void setShareIntent(int position) { // BEGIN_INCLUDE(update_sap) if (mShareActionProvider != null) { // Get the currently selected item, and retrieve it's share intent ContentItem item = mItems.get(position); Intent shareIntent = item.getShareIntent(MainActivity.this); // Now update the ShareActionProvider with the new share intent mShareActionProvider.setShareIntent(shareIntent); } // END_INCLUDE(update_sap) } 

main_menu.xml

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:support="http://schemas.android.com/apk/res-auto"> <!-- To use ShareActionProvider provided by ActionBarCompat, we reference the class by set the support:actionProviderClass attribute with the full class name of ShareActionProvider. --> <item android:id="@+id/menu_share" android:title="@string/menu_share" support:actionProviderClass="android.support.v7.widget.ShareActionProvider" support:showAsAction="always" />