【发布时间】:2015-12-21 15:57:41
【问题描述】:
我已经实现了Android Studio 1.5.1 中给出的导航抽屉。
- 我有 5 个导航抽屉项目,每个项目都有一个片段。每个 Fragment 都有 Share 方法(不常见)。
- 在第一个导航抽屉项目的片段中,可以说 OldStory 片段,我正在使用 Viewpager 进行滑动视图,该视图由 3 个片段和 FragmentStatePagerAdapter 组成。它有 Share 方法。
问题 - Story Fragment 的共享方法每次都会被调用,即使屏幕上显示了其他片段。调试后,我知道 Story 片段中的方法被调用了。 - 如果我禁用 OldStory Fragment,那么一切正常。
我无法解决这个问题。我读了很多问题/答案,但它们与活动和片段方法有关。请帮我解决这个问题。
注意 - OldStory 片段具有扩展 FragmentStatePagerAdapter 类的内部类。此类创建许多故事片段。其他实现方式相同。
public class OldStory extends Fragment {
private StoryPagerAdapter storyPagerAdapter;
private InfiniteViewPager viewPager;
SharedPreferences sharedPreferences;
private int TotalCount;
public OldStory() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Notify the system to allow an options menu for this fragment.
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
final View rootView = inflater.inflate(R.layout.fragment_old_story, container, false);
viewPager = (InfiniteViewPager) rootView.findViewById(R.id.pager);
viewPager.setOffscreenPageLimit(0);
sharedPreferences = getActivity().getSharedPreferences(Startup.PreferenceSETTINGS, Context.MODE_PRIVATE);
TotalCount = sharedPreferences.getInt(Startup.StoryCount, 4);
storyPagerAdapter = new StoryPagerAdapter(getFragmentManager());
PagerAdapter wrappedAdapter = new InfinitePagerAdapter(storyPagerAdapter);
viewPager.setAdapter(wrappedAdapter);
viewPager.setCurrentItem(TotalCount-1);
return rootView;
}
public class StoryPagerAdapter extends FragmentStatePagerAdapter {
public StoryPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return Story.newInstance(position+1);
}
@Override
public int getCount() {
return TotalCount;
}
}
}
故事片段方法实现 -
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear();
inflater.inflate(R.menu.story, menu);
getActivity().getMenuInflater().inflate(R.menu.main, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.Refresh:
// We make sure that the SwipeRefreshLayout is displaying it's refreshing indicator
if(!visiblity) {
if (!RefreshLayout.isRefreshing()) {
ErrorLayout.setVisibility(View.GONE);
RefreshLayout.setRefreshing(true);
}
// Start our refresh background task
initiateRequest(Today);
}
return true;
case R.id.Share:
//InShort = sharedPreferences.getString(Startup.InShort, null);
Toast.makeText(getContext(), "Stories", Toast.LENGTH_SHORT).show();
if (InShort!= null && !InShort.isEmpty())
{
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "Hi From Story");
sendIntent.setType("text/plain");
startActivity(sendIntent);
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
MainActivity用于切换片段。
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
displayView(item.getItemId());
return true;
}
//method to replace Views in ID = content_frame in content_main
public void displayView(int viewID)
{
fragment = null;
title = getString(R.string.app_name);
switch (viewID)
{
case R.id.nav_frag0:
fragment = new OldStory();
title = getString(R.string.story);
viewIsAtHome = true;
break;
case R.id.nav_frag1:
fragment = new Fragment1();
title = getString(R.string.fragment1);
viewIsAtHome = false;
break;
case R.id.nav_frag2:
fragment = new Fragment2();
title = getString(R.string.fragment2);
viewIsAtHome = false;
break;
case R.id.nav_frag3:
fragment = new Fragment3();
title = getString(R.string.fragment3);
viewIsAtHome = false;
break;
case R.id.nav_frag4:
fragment = new Fragment4();
viewIsAtHome = false;
title = getString(R.string.fragment4);
break;
case R.id.nav_share:
fragment = new Fragment5();
title = getString(R.string.fragment5);
viewIsAtHome = false;
break;
}
if (fragment != null)
{
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame,fragment);
ft.commit();
}
//set the toolbar title
if(getSupportActionBar() != null)
{
getSupportActionBar().setTitle(title);
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
}
【问题讨论】:
-
你能添加你如何初始化和切换片段的代码吗?我是对的,问题是一旦您通过 NavigationDrawer 切换到另一个片段,嵌套在 ViewPager 片段中仍然会得到
onOptionsItemSelected调用? -
到目前为止,您似乎面临同样的问题,如下所示:stackoverflow.com/a/34401646/1658267 不过,最好有更多的上下文来确定
-
还有一件事 - 你如何使用
setHasOptionsMenu()? -
@KonstantinLoginov 我已经用 MainActivity 代码更新了我的问题。
-
没有 setHasOptionsMenu() 你永远不会得到菜单被夸大。但是在代码 sn-ps 中,我没有看到这个方法被调用。如果你愿意,我可以上传带有 viewpagers、不同 Fragment 和 NavigationDrawer 的测试项目,这样你就可以尝试看看可能的差异..
标签: android android-fragments android-viewpager