布局不在Android Fragment中维护状态

时间:2013-12-18 11:03:06

标签: android android-fragments

我已经看到很多关于在Fragments中保存布局方向更改但无法解决问题的问题。 我有片段活动。在它的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 片段中,我创建了两个按钮和一个edittext。现在点击其中一个按钮,我隐藏了另一个按钮和edittext。

当我旋转屏幕时,重新创建布局,即使我放了setRetainInstance(true)

,我也可以看到我的所有小部件

我的小部件没有维持状态。如果它们不可见,则在旋转屏幕时应保持不可见

2 个答案:

答案 0 :(得分:3)

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

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

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

即。默认情况下,没有为您保存任何内容TextView之类的观点将save additional state(例如当前文字,如果使用 true 调用setFreezesText)。我不知道任何保存可见性状态的默认视图。

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

  1. 创建所需视图的子类并覆盖View.onSaveInstanceState,以保存对该包的可见性。方法概述here
  2. 覆盖包含您的视图的片段中的Fragment.onSaveInstanceState,从而保存对该捆绑的可见性。
  3. 使用Fragment.setRetainInstance(true),并将Fragment中的可见性状态维护为实例变量,在再次创建View后重新应用状态。警告:如果您的进程在后台被终止,则不会保留状态,其他两个选项都会这样做。

答案 1 :(得分:1)

工作解决方案

正在使用setRetainInstance(true)

片段将保留状态。除此之外,您必须找到一种方法来保留视图的可见性状态,并在片段的onViewCreated()方法中重新创建视图。

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

在下面的代码段中,我在&#34; rbChecked&#34;中保留单选按钮选中的值。变量使用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;
        }
    }

}

}