10

ActionBar に、ShareActionProvider と他のいくつかのオプションがあります。ただし、縦向きモードで最初にレンダリングされたときに ShareActionProvider が正しくレンダリングされず、最初のレンダリングでクリックできないようです。向きを変更すると画面が再レンダリングされ、表示されるはずのすべてのオプションが表示され、ActionBar を元に戻すと再レンダリングされますが、今回はポートレート モードでも適切にレンダリングされます。

状況を説明する画像を添付しました。

  1. 共有オプションが正しく表示されません。横にアイコンが表示され、レイアウトに合わない場合は 3 ドット メニューになります。

  2. オリエンテーションの後、すべてのオプションが期待どおりに表示されます。

  3. 縦向きに戻すと、ActionBar が再レンダリングされ、3 ドット メニューが表示され、クリックできるようになりました。

ここで何が起こっているかについてのアイデアはありますか?

アクションバーの説明

これは私のXMLです:

    <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/item_delete"
        android:icon="@android:drawable/ic_menu_delete"
        android:showAsAction="ifRoom|withText"
        android:title="Delete"
        android:visible="false"/>
    <item
        android:id="@+id/item_edit"
        android:icon="@android:drawable/ic_menu_edit"
        android:showAsAction="ifRoom|withText"
        android:title="Edit"
        android:visible="false"/>
    <item
        android:id="@+id/item_share"
        android:actionProviderClass="android.widget.ShareActionProvider"
        android:showAsAction="ifRoom|withText"
        android:title="Share"
        android:visible="false"/>
    <item
        android:id="@+id/item_save"
        android:icon="@android:drawable/ic_menu_save"
        android:showAsAction="ifRoom|withText"
        android:title="Save"
        android:visible="false"/>
    <item
        android:id="@+id/menu_search"
        android:actionViewClass="android.widget.SearchView"
        android:icon="@android:drawable/ic_menu_search"
        android:showAsAction="ifRoom"
        android:title="@string/menu_search"
        android:visible="false"/>

</menu>

そして、これが Fragment でオプション メニューを処理する方法です。

 /**
 * Hook into the OptionsMenu and add an Edit, Delete and Share option.
 */
@Override
public void onPrepareOptionsMenu(Menu menu) {
    MenuItem deleteItem = menu.findItem(R.id.item_delete);
    deleteItem.setVisible(true);

    MenuItem editItem = menu.findItem(R.id.item_edit);
    editItem.setVisible(true);

    MenuItem shareItem = menu.findItem(R.id.item_share);
    shareItem.setVisible(true);
    shareActionProvider = (ShareActionProvider) shareItem.getActionProvider();
    shareActionProvider.setShareIntent(getShareIntent());

    super.onPrepareOptionsMenu(menu);
}

/**
 * Builds an intent that takes the path for the image and passes it to 
 * the sharing mechanism as a stream built on the URI of the image path.
 * @return the intent to share the image as a stream
 */
private Intent getShareIntent()
{
    Intent shareIntent = new Intent();
    shareIntent.setAction(Intent.ACTION_SEND);
    shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + receipt.getPhoto()));
    shareIntent.setType("image/jpeg");
    return shareIntent;
}
4

4 に答える 4

30

ShareActionPRoviderこれは、メニューを膨張させた後、右側にインテントを追加する必要があるためですonCreateOptionsMenu

のみでそれを行う場合はonPrepareOptionsMenu、手動で呼び出しinvalidateOptionsMenu()て ActionBar の更新をトリガーする必要があります (選択した回答が指示するように)。しかし、それはそれを行う方法ではありません。

が呼び出されるため、構成が変更されたときに正常に機能しonPrepareOptionsMenu()、インテントがあるため、共有ボタンが機能します。

これを修正するには、次のようにします。

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getSupportMenuInflater().inflate(R.menu.YOUR_MENU_XML, menu);

    ShareActionProvider provider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();

    if (provider != null) {
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_TEXT, YOUR_TEXT);
        shareIntent.setType("text/plain");
        provider.setShareIntent(shareIntent);
    }

    return true;
}

このように、は最初からShareActionProviderを持ち、期待どおりに動作します。Intent

于 2013-05-14T21:42:01.883 に答える
1

したがって、フラグメントのonCreateViewで「 getActivity()。invalidateOptionsMenu()」を呼び出すと、メニューが適切に再レンダリングされるようです。ただし、最初の実行では正しくレンダリングされるはずですが、メニューを変更せずに無効にすると、適切な解決策とは思えません。

于 2012-08-23T08:32:25.897 に答える
1

バグではないと思います。タイトルが変わったからです。元々は短かった(「ReceiptDetail」ではなく「Details」)ので、システムはより多くのアクションアイテムを表示する余地があると考えていたに違いありません。

また、ShareActionProviderの幅は動的です(通常の幅の最大2倍になる可能性があります)。

1つか2つテストするには、共有アクションアイテムを最初の位置に移動し、一時的な回避策を削除して、それがまだ発生するかどうかを確認することをお勧めします。共有アクションアイテムを削除して、3つ以上の従来のアクションアイテムをテストとして使用することもできます。

于 2012-12-26T22:04:23.607 に答える
1

プラットフォームのバグのようです。詳細については、http://code.google.com/p/android/issues/detail? id=25467を確認してください。

于 2012-12-26T03:57:44.743 に答える