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”的正确位置在哪里?
答案 0 :(得分:4)
在处理类似问题时,我偶然发现了这个问题。关于公认解决方案的2件事:
现在 - 考虑到这一点,这是一个简单的解决方案:将您的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);
}