
>创建活动时,它会显示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在旋转设备两次时失去状态所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)