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

ShareActionProviderAPI 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 および一般的な ActionProvider は、Android 4.0 (API レベル 14) から Android フレームワークに追加されました。しかし、AndroidSupportLibrary は、以前のバージョンでもこの機能をサポートするのに役立ちます。しかし、一般的には、ShareActionProvider を Android SDK フレームワークからインポートするのに誤りがあり、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>

: 「android」名前空間ではなく「app」名前空間が使用されていることに注意してください。なぜですか? => これはサポート ライブラリで定義された 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 は「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 に答える