我的应用程序有两个fragments
,一个是列表,一个是详细视图,它们都以横向模式显示,而只有列表以肖像显示。在配置更改时,如果我在两个onCreateOptionsMenu
的fragments
中都设置了一个断点,则它们将被击中两次,并且Actionbar
中的菜单项将被复制。
我尝试在不同的事件(例如invalidateOptionsMenu
和onResume
)中设置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检索它的实例并改为使用该实例。
对于细节片段,我不会在布局上有一个片段声明,而是将其替换为可用于添加寻呼机适配器的常规布局。