例外:不支持此function,请使用MenuItemCompat.getActionProvider()

我正在尝试在Android应用程序的Action Bar中创建“共享”按钮。 这是我的代码:

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; } 

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

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

它链接到onCreateOptionsMenu()的字符串:

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

我做错了什么?

PS:来自logcat的错误堆栈跟踪:

01-11 13:03:17.490 2331-2331 / com。*****。*****。***** E / AndroidRuntime:FATAL EXCEPTION:主程序: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) 

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

其次,如果您坚持使用appcompat-v7 ,那么您无法安全地使用getActionProvider() ,因为该方法将不存在于API级别10及更低级别。 用MenuItemCompat.getActionProvider(menuItem)替换menuItem.getActionProvider() MenuItemCompat.getActionProvider(menuItem)

FWIW, 这是一个实现appcompat-v7ShareActionProvider 的示例项目 。

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

最简单的方法是转到Android Studio =>文件,导入示例。 然后输入“共享操作提供程序”。

在此处输入图像描述

下面是使用带有ActionBarCompat的ShareActionProvider创建共享操作菜单项所涉及的代码,向后兼容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