Фон: слева у меня есть меню, а справа другое прокручиваемое содержимое. я хотел сохранить прокручиваемую позицию. Но я потерпел неудачу. Тогда...
Я создал очень простой проект, чтобы проверить его.
Другими словами, у меня есть меню слева, а разное содержимое содержит <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
(например, положение прокрутки), где я должен разместить свои коды?
Bundle
вFragment.onSaveInstanceState()
всегда равноnull
(даже когда экран вращается или вызываетсяFragmentManager.saveFragmentInstanceState()
). Это странно для меня. Не могли бы вы немного объяснить? - person midnite   schedule 07.04.2013