2013-04-22 2 views
1

я включил ShareActionProvider и я получаю эту ошибку:Android java.lang.NoSuchMethodError ошибка: android.view.MenuItem.getActionProvider

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

Спасибо. Alex

ответ

1

Да, вы должны иметь те же самые проверки для пунктов меню. См. Документы для getActionProvider. Он поддерживается только 14+. Чтобы протестировать такое устройство без устройства, вы можете попробовать эмулятор, который использует более старую версию Android.

0

Вам необходимо добавить условие к вашему, когда вы поддерживаете более низкие API, сохраняя при этом более высокие вызовы API. В этом случае ИТ потерпит неудачу, так как такого метода пока нет. И я хотел бы предложить, чтобы немного улучшить читабельность кода, заменив строки, как:

if (android.os.Build.VERSION.SDK_INT >= 14) 

с

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWITCH) 
4

ShareActionProvider доступна только для API 14+, что означает, в более ранних версиях вы не можете используй это. Если вы хотите добавить кнопку совместного доступа в свое приложение и поддерживать старые уровни API, я могу предложить вам использовать ActionBarSherlock - библиотеку, которая дает вам возможность использовать ActionBar в старых версиях Android. Используя эту библиотеку, вы можете сделать что-то вроде этого, чтобы добавить кнопку совместного доступа:

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.

Надеюсь, что эта помощь.

+0

Что делать, если я завершу вызов в try/catch? – Genadinik

+0

, если вы используете actionbarsherlock, вам не нужен блок try/catch. просто не забудьте включить shareactionprovider из библиотеки abs, а не android. это все. – hardartcore

1

В документации вы можете увидеть, что MenuItem.getActionProvifer() из 14 API, конечно же, вы поймаете java.lang.NoSuchMethodError на более старых версиях (эти ошибки будут возникать каждый раз при использовании методов или классов из нового API).

Использование try-catch не может спасти вас :) Вам нужно использовать различные реализации с обходными hanler-классами для разных критических версий API.

Если вы будете использовать ActionBarSherlock, вы можете использовать этот метод в Android API> = 8. Попробуйте сохранить функциональность для API maximem, это будет здорово!

+0

Спасибо. Что делать, если я также добавляю try/catch в фактическом методе onCreateOptionsMenu? – Genadinik

+0

@Genadinik, NoSuchMethodError расширяет http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Error.html и, как я знаю, вы не можете поймать его с помощью try-catch. – nfirex

1

Немного поздно ....

ShareActionProvider and in general ActionProviders are added from Android 4.0 (API Level 14) to Android Framework. But the AndroidSupportLibrary helps us to support this feature in previous versions as well. But generally we do a mistake importing the ShareActionProvider from the Android SDK framework but not the 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> 

Примечание: Заметьте, что используется пространство имен 'приложение', а не «андроид 'namespace' ПОЧЕМУ? => Это необходимо при использовании любых атрибутов XML, определенных библиотекой поддержки, поскольку эти атрибуты не существуют в платформе Android на старых устройствах. Поэтому вы должны использовать свое собственное пространство имен в качестве префикса для всех атрибутов, определенных библиотекой поддержки.

-> В 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 импортируется из "импортного android.support.v7.widget.ShareActionProvider" и наблюдать использование «MenuItemCompat.getActionProvider() ", чтобы получить экземпляр ActionProvider.

Смежные вопросы