我已经看到很多关于在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)
我的小部件没有维持状态。如果它们不可见,则在旋转屏幕时应保持不可见
答案 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)。我不知道任何保存可见性状态的默认视图。
如果您希望保留可见性状态,则必须自行保存。以下是一些选项:
View.onSaveInstanceState
,以保存对该包的可见性。方法概述here。Fragment.onSaveInstanceState
,从而保存对该捆绑的可见性。 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;
}
}
}
}