onCreateOptionsMenu在配置更改时调用了两次

时间:2013-02-03 01:21:28

标签: android android-fragments android-actionbar actionbarsherlock

我的应用有两个fragments,一个是列表,另一个是详细视图,它们都以横向模式显示,只有列表以portait显示。在配置更改时,如果我在两个onCreateOptionsMenu的{​​{1}}中放置一个断点,它们将被击中两次,fragments中的菜单项将被复制。

我尝试在不同的事件中设置Actionbar,例如invalidateOptionsMenuonResume,但这似乎没有帮助。我不确定是什么会导致onActivityCreated被击中两次。

我注意到有一个解决方案here,但这对我不起作用。它会导致onCreateOptionsMenu上的java.lang.IllegalArgumentException No view found for for fragment onStart。{/ p>

更新

我在使用Activity时以正常模式加载ViewPager

fragments

和横向模式我通过XML添加public class Main extends SherlockFragmentActivity { private static List<Fragment> fragments; @Override public void onCreate(final Bundle icicle) { setContentView(R.layout.main); } @Override public void onResume() { mViewPager = (ViewPager)findViewById(R.id.viewpager); if (mViewPager != null) { fragments = new ArrayList<Fragment>(); fragments.add(new MyListFragment()); fragments.add(MyDetailFragment.newInstance(0)); fragments.add(MyDetailFragment.newInstance(1)); fragments.add(MyDetailFragment.newInstance(2)); mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); mViewPager.setAdapter(mMyFragmentPagerAdapter); } } private static class MyFragmentPagerAdapter extends FragmentStatePagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int index) { return fragments.get(index); } @Override public int getCount() { return 4; } @Override public int getItemPosition(Object object) { return POSITION_NONE; } } } 。这是fragments文件夹中的main.xml文件:

layout-land

这是<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_height="fill_parent" android:layout_width="fill_parent" android:weightSum="3" > <fragment android:name="com.app.ListingFragment" android:id="@+id/fragmentDetails" android:layout_weight="1" android:layout_width="0dp" android:layout_height="fill_parent" /> <fragment android:name="com.app.DetailFragment" android:id="@+id/fragmentDetails" android:layout_width="0dp" android:layout_weight="2" android:layout_height="fill_parent" /> </LinearLayout> 文件夹中的XML:

layout

1 个答案:

答案 0 :(得分:2)

问题是您是在布局文件中添加片段,还是通过调用构造函数/ newInstance方法手动实例化它们。

如果在布局上添加片段,android框架将为您实例化它。在您发布的代码中,您总共有4个Details片段和2个列表片段实例,即使您可能无法全部看到它们。

不是手动实例化片段,而是应该通过调用FragmentManager.getFragmentById来检索它的实例,而是使用该实例。

对于细节片段,我不会在布局上使用一个片段声明,而是将其替换为可用于添加寻呼机适配器的普通布局