1

1.背景

画面に

ShareActionProvider

ViewPager

フラグメントを使用します。

私が望んでいたのは、現在表示されているフラグメント内から情報を取得してインテントを作成することでした。これにより、ShareActionProviderでインテントを設定できるようになります。

これは、ShareActionProviderのインテントを設定するために使用するコードです。

    MenuItem actionItem = men.getMenu().findItem(R.id.menu_item_share_action_provider_action_bar);
    ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
    actionProvider.setShareIntent(createShareIntent(mProduct.mProduct));

Fragmentクラスのこれらの関数内など、いくつかの場所でこれを使用してみました。

onCreateView
onStart

また、FragmentPagerAdapterクラス内のこれらの関数で使用してみました。

getItem

2.問題

インテントは実際にはShareActionProvider内で設定されていますが、取得される情報は次のフラグメント(現在表示されていないフラグメント)に関するものです。例えば:

4つのフラグメント(frag1、frag2、frag3、frag4)があり、現在「frag1」を表示している場合、ShareActionProviderは「frag2」を共有しようとします。これは、正しい値を共有する「frag4」に到達するまで当てはまります。

私の推測では、フラグメントページャーは現在のビューと次のビュー(非表示)を作成し、それがShareActionProviderを設定します。この場合、「setShareIntent」の正しい場所はどこですか?

4

3 に答える 3

4

同様の問題を扱っているときに、私はこの質問に出くわしました。受け入れられた解決策についての2つのこと:

  1. 特にアダプタの一部のリストでは、フラグメントへの参照をどこにも保存しないでください
  2. フラグメントにフィールドを作成せず、常に必要なデータをバンドルに保存して、Fragment#getArgumentsを使用して取得できるようにします。

これを念頭に置いて、簡単な解決策を次に示します。ShareActionProvider初期化コードをonPrepareOptionsMenu呼び出します。このようなもの:

@Override
public void onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    MenuItem menuShare = menu.findItem(R.id.menuShare);
    ShareActionProvider shareAction = (ShareActionProvider) 
         menuShare.getActionProvider();
    shareAction.setShareIntent(createShareIntent());
}

protected Intent createShareIntent() {
    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setType("text/plain");
    Job job = getArguments().getSerializable(JOB);
    shareIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, job.title);
    shareIntent.putExtra(android.content.Intent.EXTRA_TEXT, job.toText());
    return shareIntent;
}
于 2012-11-09T06:22:48.203 に答える
1

私はこれを自分で行う方法を理解することができました。私がやったことは、

OnPageChangeListener

フラグメントアクティビティで

private final OnPageChangeListener mOnPageChangeListener = new OnPageChangeListener() {

    @Override
    public void onPageScrollStateChanged(int arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onPageSelected(int arg0) {
        // TODO Auto-generated method stub
        TestFragment frag = (TestFragment) adapter.mFragments.get(pager.getCurrentItem());

        frag.setShareActionIntent();

    }

};
于 2012-04-29T15:57:31.893 に答える
0

http://developer.android.com/reference/android/widget/ShareActionProvider.html

androidsdkdocの例は次のとおりです。

  // In Activity#onCreateOptionsMenu
  public boolean onCreateOptionsMenu(Menu menu) {
      // Get the menu item.
      MenuItem menuItem = menu.findItem(R.id.my_menu_item);
      // Get the provider and hold onto it to set/change the share intent.
      mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
      // Set history different from the default before getting the action
      // view since a call to MenuItem.getActionView() calls
      // onCreateActionView() which uses the backing file name. Omit this
      // line if using the default share history file is desired.
      mShareActionProvider.setShareHistoryFileName("custom_share_history.xml");
      . . .
  }

  // Somewhere in the application.
  public void doShare(Intent shareIntent) {
      // When you want to share set the share intent.
      mShareActionProvider.setShareIntent(shareIntent);
  }
于 2012-04-28T09:27:39.230 に答える