我启用了ShareActionProvider
并收到此错误:
java.lang.NoSuchMethodError: android.view.MenuItem.getActionProvider
但我使用这个类的方式是这样的:
// SHARING ONLY ENABLED in SDK 14 which is Ice Cream Sandwich
try
{
if ( android.os.Build.VERSION.SDK_INT >= 14 )
{
Button share = (Button)findViewById(R.id.share_button);
share.setOnClickListener(new Button.OnClickListener()
{
public void onClick(View v)
{
openOptionsMenu();
}
});
}
else
{
// HIDE THE TWO PAGE ELEMENTS
Button share = (Button)findViewById(R.id.share_button);
TextView share_prompt = (TextView)findViewById(R.id.share_prompt);
share.setVisibility(View.GONE);
share_prompt.setVisibility(View.GONE);
}
}
catch ( Exception e )
{
}
所以我认为我不会显示早期sdk的分享按钮,我会没事的。但是我遇到了很多崩溃。
我无法真正测试这个,因为我没有配备早期版本SDK的手机。但这是否意味着每个拥有早期SDK版本的人都会崩溃这些页面?或者只是点击分享的人?如何防止此崩溃?
我在课堂上有这些方法。如果sdk小于14,我应该不运行它们吗?
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.layout.menu, menu);
MenuItem item = menu.findItem(R.id.menu_item_share);
myShareActionProvider = (ShareActionProvider)item.getActionProvider();
myShareActionProvider.setShareHistoryFileName(
ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
myShareActionProvider.setShareIntent(createShareIntent());
return true;
}
private Intent createShareIntent()
{
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT,
"Some text");
return shareIntent;
}
// Somewhere in the application.
public void doShare(Intent shareIntent)
{
// When you want to share set the share intent.
myShareActionProvider.setShareIntent(shareIntent);
}
感谢。 亚历
答案 0 :(得分:4)
ShareActionProvider
仅适用于API 14+,这意味着在早期版本中您无法使用它。如果您想在应用中添加分享按钮并支持旧的API级别,我建议您使用ActionBarSherlock - 一个库,让您有机会在旧版本的Android中使用ActionBar。使用此库,您可以执行以下操作来添加共享按钮:
MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
actionProvider.setShareIntent(createShareIntent());
private Intent createShareIntent() {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
Uri uri = Uri.fromFile(getFileStreamPath("shared.png"));
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
return shareIntent;
}
将共享图像文件。如果您不想支持较旧的API级别,我建议您只检查API级别,具体取决于使用ShareActionProvider
。
希望得到这个帮助。
答案 1 :(得分:1)
是的,您需要对菜单项进行相同的检查。请参阅getActionProvider
的文档。它只支持14+。要在没有设备的情况下测试此类事物,您可以尝试使用旧版Android的模拟器。
答案 2 :(得分:1)
在文档中,您可以看到来自14 API的MenuItem.getActionProvifer(),当然您将在旧版本上捕获java.lang.NoSuchMethodError
(每次使用新API中的方法或类时都会遇到错误)。 / p>
使用try-catch无法保存你:)你需要为不同的关键API版本使用不同的实现方法hanler-classes。
如果您将使用ActionBarSherlock,则可以在Android API中使用该方法> = 8.尝试保存maximem API的功能,它会很棒!
答案 3 :(得分:1)
有点晚......
ShareActionProvider和一般的ActionProviders从Android 4.0(API Level 14)添加到Android Framework。 但AndroidSupportLibrary也帮助我们在以前的版本中支持此功能。但一般来说,从Android SDK框架导入ShareActionProvider而不是SupportLibrary会出错。
- >在main.xml中:
5
注意:观察使用'app'命名空间而不是'android'命名空间' 为什么? =>在使用支持库定义的任何XML属性时,这是必需的,因为旧设备上的Android框架中不存在这些属性。因此,您必须使用自己的命名空间作为支持库定义的所有属性的前缀。
- >在Activity的onCreateOptionsMenu()中:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/menu_share" android:title="@string/menuitem_detail_share"
app:showAsAction="always"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider" />
</menu>
注意:从“import android.support.v7.widget.ShareActionProvider”导入ShareActionProvider并观察“MenuItemCompat.getActionProvider()”的用法以获取ActionProvider实例。
答案 4 :(得分:0)
您需要在支持较低API时为您添加条件,同时仍使用较高的API调用。在这种情况下,IT将会失败,因为根本就没有这样的方法。我建议通过替换以下行来略微提高代码的可读性:
if ( android.os.Build.VERSION.SDK_INT >= 14 )
与
if ( android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWITCH )