Где Fragment сохраняет свое состояние, когда FragmentTransaction.Replace?
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
экземпляр (например, положение прокрутки), где я должен поставить свои коды?