旋转时保留Fragment对象

Jit*_*hin 48 android screen-rotation android-fragments android-3.0-honeycomb

我在Honeycomb开发了一个应用程序,我正在使用片段.
这是我的应用程序

  • 我有一个活动(说A1)并且有一个片段
  • 最初这个片段保存对象一个片段对象说(F1)
  • 然后根据用户操作,它可能会更改为其他对象F2,F3 ....

我的问题是什么

当用户旋转设备时,重新创建活动并使F1成为片段对象,即使在旋转之前它不是 我使用但它对我不起作用 我已经在我的函数中添加了代码片段,就像这样
What is the way to retain the fragment object while rotating?
setRetainInstance(true);
onCreate

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);

   FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();

   Fragment homeFragment = new Home();
   fragmentTransaction.add(R.id.mainFragement, homeFragment);
   fragmentTransaction.commit();
}
Run Code Online (Sandbox Code Playgroud)

Lab*_*lan 63

默认情况下,Android将保留片段对象.在您的代码中,您将homeFragmentonCreate功能中进行设置.这就是为什么它总是在你设置的一些homeFragmentfl什么onCreate.

因为无论何时旋转,onCreate都会执行并将片段对象设置为第一个

因此,简单的解决方案是检查savedInstanceStatebundle 是否为null并设置片段对象

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(null == savedInstanceState) {
        // set you initial fragment object 
    }
 }
Run Code Online (Sandbox Code Playgroud)

  • "默认情况下,android会保留片段对象"......不是这样.Android将在方向更改时创建新对象,除非调用`setRetainInstance(true)`.不要将此与Android自动重新附加片段混淆.它们不是同一件事.检查[此答案]上的SD报告的跟踪(http://stackoverflow.com/a/12641575/2619107). (23认同)

Ral*_*alf 38

您需要为Fragment提供一个唯一标记,并检查此Fragment是否已经添加到您的Activity中.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    String tag = "my_fragment";
    FragmentManager fragmentManager = getFragmentManager();
    if(fragmentManager.findFragmentByTag(tag) == null) {
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        Fragment homeFragment = new Home();
        fragmentTransaction.add(R.id.mainFragement, homeFragment, tag);
        fragmentTransaction.commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

检查是否savedInstanceState为null不是检查您的片段是否已设置的安全方法 - 它在大多数情况下都有效,但在某些情况下(例如当设备处于低内存时),Android可能会终止您的Activity,这可能会破坏你的申请.

要查看此操作,请在设备的开发选项中选中"不要保留活动"(该设置在Android 4.0及更高版本中可用,不确定早期版本).当您打开新活动时,您的第一个活动将被销毁.当您返回它(通过按回)时,它会再次创建,并且savedInstanceState 不为 null.但是,您的片段不再存在于活动中,您必须再次添加它.

编辑 - 显示原始原则,但使用SupportFragmentManager

public class ActivityAwesome extends AppCompatActivity
{
    private final String TAG = getClass().getSimpleName();
    private FragmentHome mHomeFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layout);

        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentByTag(TAG);
        if(fragment == null)
        {
            // Create the detail fragment and add it to the activity using a fragment transaction.
            mHomeFragment = new FragmentHome();
            fragmentManager.beginTransaction()
                    .add(R.id.fragment_container, mHomeFragment, TAG)
                    .commit();
        }
        else
        {
            // get our old fragment back !
            mHomeFragment = (FragmentHome)fragment;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想mHomeFragment在旋转设备后操纵片段(在本例中),这会非常有用