显示新片段时的SetShareIntent

时间:2014-12-12 11:46:11

标签: android android-intent android-fragments android-sharing

我的问题类似于Android setShareIntent within fragment,但我在那里阅读了答案,无法弄清楚如何将它们应用到我的情况中。

我的问题的快速摘要

我想在每次片段更改时设置ShareIntent,即每当向用户显示新片段时。我怎样才能做到这一点? setShareIntent调用应该去哪里?

包含代码段的更长版本

这是我的代码的骨架:

import android.support.v7.widget.ShareActionProvider;

public class SolvePuzzle extends ActionBarActivity {
    private ShareActionProvider mShareActionProvider;
    static AppSectionsPagerAdapter mAppSectionsPagerAdapter;
    static ViewPager mViewPager;

    ...

    public void onCreate(Bundle savedInstanceState) {

        ...

        mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager());
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mAppSectionsPagerAdapter);
    }
}

然后来了

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.solve_puzzle, menu);
        MenuItem item = menu.findItem(R.id.menu_item_share);

        mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);
        if (mShareActionProvider == null) {
            // Following https://stackoverflow.com/questions/19358510/why-menuitemcompat-getactionprovider-returns-null
            mShareActionProvider = new ShareActionProvider(this);
            MenuItemCompat.setActionProvider(item, mShareActionProvider);

            Intent shareIntent = new Intent();
            shareIntent.setAction(Intent.ACTION_SEND);
            shareIntent.putExtra(Intent.EXTRA_TEXT, "Some text");  // For debugging
            shareIntent.setType("text/plain");
            setShareIntent(shareIntent);

            Log.d(DEBUG_TAG, "Called new mShareActionProvider(this) and set share intent");
        }
        return true;
    }

    private void setShareIntent(Intent shareIntent) {
        // Want to call this whenever new puzzle fragment is displayed
        if (mShareActionProvider != null) {
            mShareActionProvider.setShareIntent(shareIntent);
        } else {
            Log.d(DEBUG_TAG, "Could not set share intent:  mShareActionProvider == null");
        }
    }

然后我有一个public class AppSectionsPagerAdapter extends FragmentPagerAdapter和一个public class SolvePuzzleFragment extends Fragment implements OnClickListener

目前我在SolvePuzzleFragment的onCreateView中调用setShareIntent。

这不起作用:当我查看我的logcat时,我看到来自片段(前两行)的setShareIntent调用发生在来自SolvePuzzle类的onCreateOptionsMenu调用之前(最后一行):

  

12-12 12:39:26.505:D / Debug(3864):无法设置共享意图:   mShareActionProvider == null

     

12-12 12:39:26.515:D / Debug(3864):无法设置共享意图:   mShareActionProvider == null

     

12-12 12:39:26.565:D / Debug(3864):叫做new   mShareActionProvider(this)和设置共享意图

......看起来片段中有两个调用。这是因为当前片段和下一个片段都已创建(调用了他们的onCreateView),即使只显示了第一个片段吗?

看起来在片段的onCreateView中调用setShareIntent是一个错误。我想要做的是在向用户显示新片段时调用setShareIntent。我该怎么做?

编辑:其他信息:

分享按钮当前有效,但它会发送我在onCreateOptionsMenu中为调试目的设置的“Some text”消息。我希望一旦第一个片段显示给用户就会被片段相关的意图覆盖(并在每次显示新片段时覆盖)。

1 个答案:

答案 0 :(得分:1)

  

我该怎么做? setShareIntent调用应该去哪里?

Register an OnPageChangeListenerViewPager via setOnPageChangeListener()一起,将setShareIntent()电话放入听众的onPageSelected()