我的问题类似于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”消息。我希望一旦第一个片段显示给用户就会被片段相关的意图覆盖(并在每次显示新片段时覆盖)。
答案 0 :(得分:1)
我该怎么做? setShareIntent调用应该去哪里?
Register an OnPageChangeListener
与ViewPager
via setOnPageChangeListener()
一起,将setShareIntent()
电话放入听众的onPageSelected()
。