我的应用程序有两个fragments,一个是列表,一个是详细视图,它们都以横向模式显示,而只有列表以肖像显示。在配置更改时,如果我在两个onCreateOptionsMenufragments中都设置了一个断点,则它们将被击中两次,并且Actionbar中的菜单项将被复制。

我尝试在不同的事件(例如invalidateOptionsMenuonResume)中设置onActivityCreated,但这似乎无济于事。我不确定是什么原因导致onCreateOptionsMenu被击中两次。

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

更新

在纵向模式下,我正在使用ViewPager加载fragments

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;
        }
   }
}


它是横向模式,我通过XML添加fragments。这是layout-land文件夹中的main.xml文件:

<?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>


这是layout文件夹中的XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
     />

 </RelativeLayout>

最佳答案

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

如果您在布局上添加片段,则android框架会为您实例化它。在您发布的代码中,尽管您可能看不到它们,但总共有4个Details片段和2个list片段实例。

与其手动实例化片段,不如通过调用FragmentManager.getFragmentById检索它的实例并改为使用该实例。

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

10-08 12:21