Backgroud:我左边有一个菜单,右边有不同的可滚动内容。我想保存滚动位置。但我失败了。然后......
我已经设置了一个非常简单的项目来测试它。
用文字说,左边有一个菜单,右边有不同的内容<EditText>
。 (虽然是同一类,但它们的情况不同)
在代码中,(非常简单)
content.xml中
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Please save my text ..." />
ContentFragment.java
package ... import ...
public class ContentFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.content, container, false);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
System.out.println("Why this is NOT called ?");
Log.v("onSaveInstanceState()", "outState = " + outState);
}
}
并且程序生成 MenuFragment.java
package ... import ...
public class MenuFragment extends ListFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, new String[]{"Item 1", "Item 2", "Item 3"}));
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
((MainActivity) getActivity()).click();
}
}
最后,我们的 MainActivity.java
package ... import ...
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null)
getSupportFragmentManager().beginTransaction()
.add(R.id.menu, new MenuFragment()).commit();
}
public void click() {
getSupportFragmentManager().beginTransaction()
.replace(R.id.content, new ContentFragment() // everytime load a new instance
).addToBackStack(null).commit();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
System.out.println("... and this is NOT called neither :-/");
Log.v("onSaveInstanceState()", "outState = " + outState);
}
}
要进行测试,请不要旋转设备。
首先,从菜单中选择一个项目,然后在文本框中键入内容。然后选择另一个项目并再次键入内容。重复几次。然后导航回来......
您会发现之前输入的文字已保存!!!
保存文本并不奇怪......
但 感到惊讶的是, 保存了所有onSaveInstanceState()
未调用的函数 。
Android什么时候replaced
FragmentTransaction
按Fragment
保存?
如果我想在每个{{1}}实例中另外保存一些数据(比如滚动位置),我应该把代码放在哪里?
答案 0 :(得分:0)
默认情况下,Edittext会保存自己的实例。见Yalla T.的答案。