2

我正在使用以下代码用 2 个片段填充我的 UI,容器是FrameLayout在 XML 中定义的。这是第一次调用此代码,即当应用程序启动时,它工作正常,并且我的两个片段都按预期显示。但是,在配置更改(特别是方向)之后,仅显示事务中的第一个片段。

我认为这不是片段本身的问题,因为如果我反转代码以便在另一个之前调用一个替换,反之亦然,将显示该片段。因此,例如,以下面的代码片段为指导,如果我交换 mSummary 和 mDetails 替换调用,则将显示 mDetails 而不会显示 mSummary。

丢失的总是块中的第二个。

// Using tablet layout
} else {
    FragmentManager fm = super.getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.summary_container, mSummaryFragment);
    ft.replace(R.id.details_container, mDetailsFragment);
    ft.commit();
}

我正在保存片段并从重新创建活动时onSaveInstanceState恢复它们。Bundle savedInstanceState我还尝试通过调用commit()然后获取另一个FragmentTransaction对象将事务分成两部分,但那里没有乐趣。

4

3 回答 3

1

因此,对于以后遇到此问题的任何人...

我终于设法通过创建片段的新实例并使用Fragment.SavedState对象恢复它的状态来解决这个问题。所以:

        if (mSummaryFragment.isAdded() && mDetailsFragment.isAdded()) {
            Fragment.SavedState sumState = getSupportFragmentManager().saveFragmentInstanceState(mSummaryFragment);
            Fragment.SavedState detState = getSupportFragmentManager().saveFragmentInstanceState(mDetailsFragment);

            mSummaryFragment = new SummaryFragment();
            mSummaryFragment.setInitialSavedState(sumState);

            mDetailsFragment = new DetailsFragment();
            mDetailsFragment.setInitialSavedState(detState);
        }

        FragmentTransaction ft = mFragmentManager.beginTransaction();

        ft.add(R.id.summary_container, mSummaryFragment);
        ft.add(R.id.details_container, mDetailsFragment);

        ft.commit();

我不明白为什么这有效而旧方法无效,但这可能对其他人有帮助。

于 2013-09-29T21:39:13.197 回答
-1

尝试android:configChanges="orientation|keyboardHidden|screenSize"使用android-manifest

注意从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。因此,如果您想防止在为 API 级别 13 或更高级别(由minSdkVersionandtargetSdkVersion属性声明)开发时由于方向更改而导致运行时重新启动,则除了“orientation”值之外,还必须包含“screenSize”值。也就是说,您必须声明android:configChanges="orientation|screenSize"。但是,如果您的应用程序以 API 级别 12 或更低级别为目标,那么您的 Activity 始终会自行处理此配置更改(此配置更改不会重新启动您的 Activity,即使在 Android 3.2 或更高版本的设备上运行时也是如此)。

来源:文档

因此,如果您的应用程序针对API 13 及更高版本,还要添加“|screenSize”configChanges

于 2013-09-22T07:54:15.190 回答
-1

这应该有效,方向改变不会影响片段。如果您遇到任何问题,请告诉我。

public class MainActivity extends FragmentActivity {
     Fragment fragment = new Fragment1();
     Fragment fragment2=new Fragment2();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

          FragmentManager fm = super.getSupportFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            ft.replace(R.id.frame1, fragment);
            ft.replace(R.id.frame2, fragment2);
            ft.commit();

    }
    public void onSaveInstanceState(Bundle outState){
        getSupportFragmentManager().putFragment(outState,"fragment1",fragment);
        getSupportFragmentManager().putFragment(outState,"fragment2",fragment2);
    }
    public void onRetoreInstanceState(Bundle inState){
        fragment = getSupportFragmentManager().getFragment(inState,"fragment1");
        fragment2 = getSupportFragmentManager().getFragment(inState,"fragment2");

    }
     class Fragment1 extends Fragment{

            @Override
            public void onActivityCreated(Bundle savedInstanceState) {

                super.onActivityCreated(savedInstanceState);
            }
        ListView listView;
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                View view=inflater.inflate(R.layout.summary_view,container,false);
                return view;
            }

            @Override
            public void onViewCreated(View view, Bundle savedInstanceState) {

                super.onViewCreated(view, savedInstanceState);
            }

        }

     class Fragment2 extends Fragment{

            @Override
            public void onActivityCreated(Bundle savedInstanceState) {

                super.onActivityCreated(savedInstanceState);
            }
        ListView listView;
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                View view=inflater.inflate(R.layout.detail_view,container,false);
                return view;
            }

            @Override
            public void onViewCreated(View view, Bundle savedInstanceState) {

                super.onViewCreated(view, savedInstanceState);
            }

        }

}
于 2013-09-22T16:36:55.587 回答