1

我启用了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);
}            

谢谢。亚历克斯

4

5 回答 5

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

希望这有帮助。

于 2013-04-22T21:33:07.677 回答
1

在文档中,您可以看到来自 14 API 的MenuItem.getActionProvifer(),当然您会java.lang.NoSuchMethodError发现旧版本(每次使用新 API 中的方法或类时都会发现错误)。

使用 try-catch 并不能拯救你:) 你需要使用不同的实现和不同的关键 API 版本的解决方法 hanler-classes。

如果您将使用ActionBarSherlock,您可以在 Android API >= 8 中使用该方法。尝试为 maximem API 保存功能,这会很棒!

于 2013-04-22T21:37:03.817 回答
1

是的,您需要对菜单项进行相同的检查。请参阅getActionProvider. 它仅在 14+ 上受支持。要在没有设备的情况下测试这种东西,您可以尝试使用旧版本 Android 的模拟器。

于 2013-04-22T21:28:49.720 回答
1

有一点晚....

ShareActionProvider 和一般的 ActionProviders 从 Android 4.0(API 级别 14)添加到 Android 框架。但 AndroidSupportLibrary 也帮助我们在以前的版本中支持此功能。但通常我们从 Android SDK 框架导入 ShareActionProvider 而不是 SupportLibrary 时会出错。

  • 代码:

-->在main.xml中:

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

注意:注意使用了“app”命名空间而不是“android”命名空间“为什么?=> 当使用支持库定义的任何 XML 属性时,这是必需的,因为这些属性在旧设备的 Android 框架中不存在。因此,您必须使用自己的命名空间作为支持库定义的所有属性的前缀。

--> 在 Activity 的 onCreateOptionsMenu() 中:

ShareActionProvider mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menuItem);
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, "The Text you want to share);
        mShareActionProvider.setShareIntent(shareIntent);

注意:ShareActionProvider是从“import android.support.v7.widget.ShareActionProvider”导入的,观察“MenuItemCompat.getActionProvider()”的用法,获取ActionProvider实例。

于 2015-05-04T09:20:37.857 回答
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 )
于 2013-04-22T21:32:17.277 回答