android – Fragment在旋转设备两次时失去状态

android – Fragment在旋转设备两次时失去状态,第1张

概述我有一个显示两个片段的活动: >创建活动时,它会显示Fragment1. >当用户按下Fragment1上的按钮时,它会显示Fragment2,添加到backstack. 碎片很简单. Fragment1包含CheckBox和EditText. Fragment2包含简单的TextView.我也在片段的onCreate(…)方法中调用setRetainInstance(true). 问题:如果显示 我有一个显示两个片段的活动:

>创建活动时,它会显示Fragment1.
>当用户按下Fragment1上的按钮时,它会显示Fragment2,添加到backstack.

碎片很简单. Fragment1包含CheckBox和EditText. Fragment2包含简单的TextVIEw.我也在片段的onCreate(…)方法中调用setRetainInstance(true).

问题:如果显示Fragment2并且设备旋转两次,Fragment1将失去其状态.但是,如果设备只旋转一次,一切都按预期工作.

重现步骤:

>启动应用程序.
>选中CheckBox并在EditText中键入一些文本
>按button启动Fragment2
>旋转设备
>再次旋转设备
>按设备上的后退按钮(或模拟器上的ESC)返回Fragment1

Fragment1失去了状态(复选框未选中,EditText为空).
但是,如果在步骤#4之后返回Fragment1 – Fragment1将按预期保持其状态.

问题出在哪儿?所有代码都在下面,包括布局.

main.xml中:

<?xml version="1.0" enCoding="utf-8"?><FrameLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:ID="@+ID/placeholder"    androID:layout_wIDth="match_parent"    androID:layout_height="match_parent" />

fragment1.xml:

<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:layout_wIDth="match_parent"    androID:layout_height="match_parent"    androID:orIEntation="vertical" >    <CheckBox        androID:ID="@+ID/checkBox1"        androID:layout_wIDth="wrap_content"        androID:layout_height="wrap_content"        androID:text="CheckBox" />    <EditText        androID:ID="@+ID/editText1"        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content" >    </EditText>    <button        androID:ID="@+ID/button1"        androID:layout_wIDth="wrap_content"        androID:layout_height="wrap_content"        androID:text="Start Fragment2" /></linearLayout>

fragment2.xml:

<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:layout_wIDth="match_parent"    androID:layout_height="match_parent"    androID:orIEntation="vertical" >    <TextVIEw        androID:ID="@+ID/textVIEw1"        androID:layout_wIDth="wrap_content"        androID:layout_height="wrap_content"        androID:text="Fragment #2" /></linearLayout>

FragmentTestActivity.java:

package fragmenttest.example.com;import androID.app.Activity;import androID.app.FragmentManager;import androID.os.Bundle;public class FragmentTestActivity extends Activity implements FragmentListener {    @OverrIDe    public voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.main);        FragmentManager fm = getFragmentManager();        if (fm.findFragmentByTag(Fragment1.TAG) == null) {            fm.beginTransaction().replace(R.ID.placeholder,new Fragment1(),Fragment1.TAG).commit();        }    }    @OverrIDe    public voID onbuttonClick() {        FragmentManager fm = getFragmentManager();        if (fm.findFragmentByTag(Fragment2.TAG) == null) {            fm.beginTransaction().replace(R.ID.placeholder,new Fragment2(),Fragment2.TAG).addToBackStack(Fragment2.TAG).commit();        }    }}

Fragment1.java:

package fragmenttest.example.com;import androID.app.Activity;import androID.app.Fragment;import androID.os.Bundle;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEw.OnClickListener;import androID.vIEw.VIEwGroup;import androID.Widget.button;public class Fragment1 extends Fragment {    public static final String TAG = Fragment1.class.getname();    private FragmentListener mListener;    @OverrIDe    public voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setRetainInstance(true);    }    @OverrIDe    public VIEw onCreateVIEw(LayoutInflater inflater,VIEwGroup container,Bundle savedInstanceState) {        VIEw root = inflater.inflate(R.layout.fragment1,container,false);        button button = (button) root.findVIEwByID(R.ID.button1);        button.setonClickListener(new OnClickListener() {            @OverrIDe            public voID onClick(VIEw v) {                mListener.onbuttonClick();            }        });        return root;    }    @OverrIDe    public voID onAttach(Activity activity) {        super.onAttach(activity);        mListener = (FragmentListener) activity;    }}

Fragment2.java:

package fragmenttest.example.com;import androID.app.Fragment;import androID.os.Bundle;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;public class Fragment2 extends Fragment {    public static final String TAG = Fragment2.class.getname();    @OverrIDe    public voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setRetainInstance(true);    }    @OverrIDe    public VIEw onCreateVIEw(LayoutInflater inflater,Bundle savedInstanceState) {        VIEw root = inflater.inflate(R.layout.fragment2,false);        return root;    }}

FragmentListener.java:

package fragmenttest.example.com;public interface FragmentListener {    public voID onbuttonClick();}
解决方法 这可能是因为在恢复片段时未调用onCreate.
请参阅: http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean) 总结

以上是内存溢出为你收集整理的android – Fragment在旋转设备两次时失去状态全部内容,希望文章能够帮你解决android – Fragment在旋转设备两次时失去状态所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1126563.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存