异常:不支持,使用 MenuItemCompat.getActionProvider()
Exception: This is not supported, use MenuItemCompat.getActionProvider()
我正在尝试在 Android 应用程序的操作栏中制作 "Share" 按钮。
这是我的代码:
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());
我做错了什么?
P.S.: 来自 logcat:
的错误堆栈跟踪
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.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.access0(ActionBarActivityDelegateBase.java:79)
at android.support.v7.app.ActionBarActivityDelegateBase.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.ShareActionProvider
与 appcompat-v7
操作栏向后移植(例如,ActionBarActivity
)一起使用。使用 ShareActionProvider
的 appcompat-v7
版本,或者将所有内容移至本机操作栏。
其次,如果您坚持使用 appcompat-v7
,那么您就不能安全地使用 getActionProvider()
,因为该方法在 API 级别 10 及以下不存在。将 menuItem.getActionProvider()
替换为 MenuItemCompat.getActionProvider(menuItem)
.
FWIW,here is a sample project 实现了 ShareActionProvider
的 appcompat-v7
版本。
您可以按照下面 link 中 Google 的代码示例中的模式进行操作。
https://github.com/googlesamples/android-ActionBarCompat-ShareActionProvider
最简单的方法是转到您的 Android Studio => 文件,导入示例。然后输入 "Share Action Provider".
下面是使用带有 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
<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" />
按照以下步骤操作:
Step.1) 要向 activity 添加 "share" 操作,请在应用栏的菜单资源中放置 ShareActionProvider
。像这样
<item android:id="@+id/action_share"
android:title="@string/share"
app:showAsAction="ifRoom"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
请注意actionProviderClass
Step.2) 现在你要确保在你的 Activity Java Class 中导入相同的 ShareActionProvider
import android.support.v7.widget.ShareActionProvider;
步骤.3)
onCreate
方法
的下方部分
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_activity_bar, menu);
ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menu.findItem(R.id.actionbar_share));
shareActionProvider.setShareIntent(shareIt());
意图方法
private Intent shareIt() {
Intent intent= new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
String shareMsgBody = "Hello, Share this with world !!";
intent.putExtra(Intent.EXTRA_TEXT, shareAndPromotionBody);
startActivity(Intent.createChooser(intent, "Spread the message!!"));
return intent;
}
我正在尝试在 Android 应用程序的操作栏中制作 "Share" 按钮。 这是我的代码:
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());
我做错了什么?
P.S.: 来自 logcat:
的错误堆栈跟踪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.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.access0(ActionBarActivityDelegateBase.java:79)
at android.support.v7.app.ActionBarActivityDelegateBase.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.ShareActionProvider
与 appcompat-v7
操作栏向后移植(例如,ActionBarActivity
)一起使用。使用 ShareActionProvider
的 appcompat-v7
版本,或者将所有内容移至本机操作栏。
其次,如果您坚持使用 appcompat-v7
,那么您就不能安全地使用 getActionProvider()
,因为该方法在 API 级别 10 及以下不存在。将 menuItem.getActionProvider()
替换为 MenuItemCompat.getActionProvider(menuItem)
.
FWIW,here is a sample project 实现了 ShareActionProvider
的 appcompat-v7
版本。
您可以按照下面 link 中 Google 的代码示例中的模式进行操作。 https://github.com/googlesamples/android-ActionBarCompat-ShareActionProvider
最简单的方法是转到您的 Android Studio => 文件,导入示例。然后输入 "Share Action Provider".
下面是使用带有 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
<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" />
按照以下步骤操作:
Step.1) 要向 activity 添加 "share" 操作,请在应用栏的菜单资源中放置 ShareActionProvider
。像这样
<item android:id="@+id/action_share"
android:title="@string/share"
app:showAsAction="ifRoom"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>
请注意actionProviderClass
Step.2) 现在你要确保在你的 Activity Java Class 中导入相同的 ShareActionProvider
import android.support.v7.widget.ShareActionProvider;
步骤.3)
onCreate
方法
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_activity_bar, menu);
ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menu.findItem(R.id.actionbar_share));
shareActionProvider.setShareIntent(shareIt());
意图方法
private Intent shareIt() {
Intent intent= new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
String shareMsgBody = "Hello, Share this with world !!";
intent.putExtra(Intent.EXTRA_TEXT, shareAndPromotionBody);
startActivity(Intent.createChooser(intent, "Spread the message!!"));
return intent;
}