Android Fragment中布局状态无法保持

3

我看到许多关于在片段中保存布局更改以适应屏幕旋转的问题,但是无法解决。 我有一个片段活动。 在它的xml文件中,我只有一个元素:-

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

在我的活动中,我正在调用碎片:

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        ForgotPassword fragment = new ForgotPassword();
        fragmentTransaction.add(R.id.fragment_container, fragment);
        fragmentTransaction.commit();

ForgotPassword片段中,我正在创建两个按钮和一个编辑框。现在,在其中一个按钮的单击事件中,我要隐藏另一个按钮和编辑框。
当我旋转屏幕时,布局被重新创建,即使我已经使用setRetainInstance(true),我仍然可以看到所有的小部件。 我的小部件没有保持它们的状态。如果它们不可见,则在旋转屏幕后应该保持不可见状态。

你是否已经为调用Fragment的Fragment Activity添加了configChanges? - Piyush
我已经加入了configChanges="screenSize"。不要告诉我加入orientation因为那不是解决方案。谢谢 - Rahul Gupta
2个回答

3

可见性不是在屏幕旋转期间保存/恢复的瞬态View状态的一部分。

保存由View.onSaveInstanceState()及其覆盖处理。View.onSaveInstanceState()的默认实现如下所示:

protected Parcelable onSaveInstanceState() {
    mPrivateFlags |= PFLAG_SAVE_STATE_CALLED;
    return BaseSavedState.EMPTY_STATE;
}

也就是说,默认情况下不会为您保存任何内容。例如,TextView 等视图将保存额外的状态(例如,如果使用 true 调用 setFreezesText,则保存当前文本)。我不知道是否有默认视图可以保存可见性状态。

如果您想要保留可见性状态,则必须自己保存。以下是一些选项:

  1. 创建您所需的View的子类,并覆盖View.onSaveInstanceState将可见性保存到bundle中。方法在此处概述。
  2. 在包含您的Views的Fragment中覆盖Fragment.onSaveInstanceState,将可见性保存到bundle中。
  3. 使用Fragment.setRetainInstance(true),并将可见状态作为实例变量在Fragment中保持,重新应用状态后再次创建View。警告:如果您的进程在后台被杀死,则不会保留状态,其他两个选项会。

1

解决方案

由于您使用了setRetainInstance(true),该片段将保留状态。除此之外,您还需要想出一种方法来保留视图的可见性状态,并在片段的onViewCreated()方法中重新创建视图。

这里需要注意的重要点是,在使用保留的可见性设置重新创建视图时,不应在onCreateView()方法中完成。

在下面的代码片段中,我使用setRetainInstance(true)保留单选按钮选中的值,并在方向更改后使用rbChecked值在onViewCreated()方法中重新创建可见性状态。

public class CaptureReminderFragment extends Fragment {

     private String rbChecked;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {

    return inflater.inflate(R.layout.capture_reminder_fragment, container, false);

}

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

    setRetainInstance(true);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ButterKnife.bind(this, view);
    if(rbChecked != null) {
        switch (rbChecked) {
            case "daily":
                layoutEvents.setVisibility(View.GONE);
                layoutReminderDay.setVisibility(View.GONE);
                layoutDate.setVisibility(View.GONE);
                layoutSpecificReminderName.setVisibility(View.GONE);
                layoutNakshatra.setVisibility(View.GONE);
                layoutRashi.setVisibility(View.GONE);
                break;
            case "events":
                layoutEvents.setVisibility(View.VISIBLE);
                layoutReminderDay.setVisibility(View.VISIBLE);
                layoutDate.setVisibility(View.GONE);
                layoutSpecificReminderName.setVisibility(View.GONE);
                layoutNakshatra.setVisibility(View.GONE);
                layoutRashi.setVisibility(View.GONE);
                break;
            case "specific":
                layoutSpecificReminderName.setVisibility(View.VISIBLE);
                layoutEvents.setVisibility(View.GONE);
                layoutReminderDay.setVisibility(View.GONE);
                layoutDate.setVisibility(View.VISIBLE);
                layoutNakshatra.setVisibility(View.GONE);
                layoutRashi.setVisibility(View.GONE);
                break;
            default:
                layoutEvents.setVisibility(View.GONE);
                layoutReminderDay.setVisibility(View.GONE);
                layoutDate.setVisibility(View.GONE);
                layoutSpecificReminderName.setVisibility(View.GONE);
                layoutNakshatra.setVisibility(View.GONE);
                layoutRashi.setVisibility(View.GONE);
                break;
        }
    }

}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接