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

我在处理类似问题时偶然发现了这个问题。关于接受的解决方案的两件事:

  1. 不要在任何地方保存对片段的引用,尤其是在适配器中的某些列表中
  2. 不要在片段中创建字段,始终将您需要的数据存储在 Bundle 中,以便您可以使用 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

来自 android sdk doc 的示例是:

  // 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 回答