Android错误java.lang.NoSuchMethodError:android.view.MenuItem.getActionProvider

时间:2013-04-22 21:09:45

标签: android shareactionprovider

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

感谢。 亚历

5 个答案:

答案 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会出错。

  • CODE:

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