片段内的Android setShareIntent

时间:2012-04-28 09:07:35

标签: android fragment android-viewpager shareactionprovider

1。背景

我的屏幕有

ShareActionProvider

ViewPager

使用片段。

我希望做的是从当前可见片段中获取一些信息以创建一个intent,然后我就可以在ShareActionProvider上设置intent。

这是我用来设置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”的正确位置在哪里?

3 个答案:

答案 0 :(得分:4)

在处理类似问题时,我偶然发现了这个问题。关于公认解决方案的2件事:

  1. 不要在任何地方保存对片段的引用,尤其是在适配器的某些列表中
  2. 不要在片段中创建字段,始终在Bundle中存储您需要的数据,以便您可以使用Fragment#getArguments
  3. 来获取它

    现在 - 考虑到这一点,这是一个简单的解决方案:将您的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;
    }
    

答案 1 :(得分: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();

    }

};

答案 2 :(得分: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);
  }