[英]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 ,則為當前文本)。 我不知道任何保存可見性狀態的默認視圖。
如果要保留可見性狀態,則必須自己保存。 以下是一些選項:
View.onSaveInstanceState
將可見性保存到包中。 這里概述的方法。 Fragment.onSaveInstanceState
,以保存對包的可見性。 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.