Где фрагмент сохраняет свое состояние, когда FragmentTransaction.Replace?

Фон: слева у меня есть меню, а справа другое прокручиваемое содержимое. я хотел сохранить прокручиваемую позицию. Но я потерпел неудачу. Тогда...

Я создал очень простой проект, чтобы проверить его.

Другими словами, у меня есть меню слева, а разное содержимое содержит <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 (например, положение прокрутки), где я должен разместить свои коды?


comment
Кроме того, я обнаружил, что Bundle в Fragment.onSaveInstanceState() всегда равно null (даже когда экран вращается или вызывается FragmentManager.saveFragmentInstanceState()). Это странно для меня. Не могли бы вы немного объяснить?   -  person midnite    schedule 07.04.2013


Ответы (1)


По умолчанию Edittext сохраняет свой собственный экземпляр. См. ответ Яллы Т.

Как сохранить данные EditText при изменении ориентации?

person John    schedule 04.09.2013