簡體   English   中英

布局無法維持Android Fragment中的狀態

[英]Layout not maintaining state in Android Fragment

我已經看到了很多有關在“片段”中保存布局更改的問題,但無法解決。 我有一個片段活動。 在它的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)也可以看到我的所有小部件。

我的小部件未保持其狀態。 如果它們不可見,則在旋轉屏幕時它們應保持不可見

可見性不是屏幕旋轉過程中保存/恢復的瞬態View狀態的一部分。

保存由View.onSaveInstanceState()及其重寫處理。 View.onSaveInstanceState()的默認實現如下:

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

即默認情況下,沒有為您保存任何內容。 諸如TextView視圖將保存其他狀態 (例如,如果使用true調用setFreezesText ,則為當前文本)。 我不知道任何保存可見性狀態的默認視圖。

如果要保留可見性狀態,則必須自己保存。 以下是一些選項:

  1. 創建所需View的子類,並重寫View.onSaveInstanceState將可見性保存到包中。 這里概述的方法。
  2. 在包含您的視圖的Fragment中覆蓋Fragment.onSaveInstanceState ,以保存對包的可見性。
  3. 使用Fragment.setRetainInstance(true) ,並在Fragment中將可見性狀態保留為實例變量,在再次創建View后重新應用該狀態。 警告:如果您的進程在后台被殺死而其他兩個選項卻沒有,則不會保留狀態。

解決方案

當您使用setRetainInstance(true)時

片段將保留狀態。 除此之外,您還必須找出一種方法來保留視圖的可見性狀態,並在片段的onViewCreated()方法中重新創建視圖。

這里要注意的重要一點是,當您使用保留的可見性設置重新創建視圖時,不應在onCreateView()中完成此操作。

在下面的代碼片段中,我使用setRetainInstance(true)將單選按鈕選中的值保留在“ rbChecked”變量中,然后在更改方向后使用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;
        }
    }

}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM