Фрагмент ViewState восстановлен в onStart?
При изменении ориентации фрагмент viewState
восстанавливается только в onStart
.
После onAttach
, onCreateView
, onViewCreated
и onActivityCreated
и даже после onCreate
.
Зачем? Слишком поздно.
Мне нужно заполнить результаты запроса db ListView на основе некоторого значения TextView. В настоящее время я пытаюсь сделать это в onViewCreated
. Но состояние просмотра на этом этапе не восстанавливается.
Могу ли я восстановить восстановление раньше?
Или как преодолеть эту проблему?
Любые идеи, пожалуйста.
PS: я использую actionbarsherlock и зависимую поддержку android support-v4 r7 library
PS2: если я загружу данные в onStart
, тогда он будет делать дополнительные запросы, когда фрагмент будет возобновлен после onStop
(я могу решить это, добавив несколько логических isLoaded
), но это не лучшее решение).
Ответы
Ответ 1
В Android API >= 17 (Android 4.2 Jelly Beans) есть метод:
public void onViewStateRestored (Bundle savedInstanceState)
который вызывается до onStart()
и после onActivityCreated()
, как указано в docs.
В Android API < 17 такого метода нет. Но есть два решения:
- Не полагайтесь на состояние представления при инициализации
Fragment
и сохраняйте все требуемое состояние инициализации как состояние Fragment
(т.е. переопределить Fragment#onSaveInstanceState()
). Позже вы можете восстановить состояние фрагмента в onCreate()
, onCreateView()
или onViewCreated()
.
- Выполните инициализацию в
onStart()
, как указано в вопросе.
Ответ 2
[ИЗМЕНИТЬ 1 - - - - - - -]
//Проверяем, был ли заполнен задний фрагмент фрагмента
//Если нет, создайте и заполните макет.
//поэтому ваш фрагмент не будет восстановлен
YourFragment yourFragment = (YourFragment )fm.findFragmentById(R.id.fragment_container);
if (yourFragment == null) {
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fragment_container, new YourFragment ());
ft.commit();
}
[ИЗМЕНИТЬ 1 - - - - - - -]
![enter image description here]()
/**
* Listing 4-4: Fragment skeleton code
* Listing 4-5: Fragment lifecycle event handlers
*/
package com.paad.fragments;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class MySkeletonFragment extends Fragment {
// Called when the Fragment is attached to its parent Activity.
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// Get a reference to the parent Activity.
}
// Called to do the initial creation of the Fragment.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Initialize the Fragment.
}
// Called once the Fragment has been created in order for it to
// create its user interface.
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
// Create, or inflate the Fragment UI, and return it.
// If this Fragment has no UI then return null.
return inflater.inflate(R.layout.my_fragment, container, false);
}
// Called once the parent Activity and the Fragment UI have
// been created.
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Complete the Fragment initialization Ğ particularly anything
// that requires the parent Activity to be initialized or the
// Fragment view to be fully inflated.
}
// Called at the start of the visible lifetime.
@Override
public void onStart(){
super.onStart();
// Apply any required UI change now that the Fragment is visible.
}
// Called at the start of the active lifetime.
@Override
public void onResume(){
super.onResume();
// Resume any paused UI updates, threads, or processes required
// by the Fragment but suspended when it became inactive.
}
// Called at the end of the active lifetime.
@Override
public void onPause(){
// Suspend UI updates, threads, or CPU intensive processes
// that don't need to be updated when the Activity isn't
// the active foreground activity.
// Persist all edits or state changes
// as after this call the process is likely to be killed.
super.onPause();
}
// Called to save UI state changes at the
// end of the active lifecycle.
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save UI state changes to the savedInstanceState.
// This bundle will be passed to onCreate, onCreateView, and
// onCreateView if the parent Activity is killed and restarted.
super.onSaveInstanceState(savedInstanceState);
}
// Called at the end of the visible lifetime.
@Override
public void onStop(){
// Suspend remaining UI updates, threads, or processing
// that aren't required when the Fragment isn't visible.
super.onStop();
}
// Called when the Fragment View has been detached.
@Override
public void onDestroyView() {
// Clean up resources related to the View.
super.onDestroyView();
}
// Called at the end of the full lifetime.
@Override
public void onDestroy(){
// Clean up any resources including ending threads,
// closing database connections etc.
super.onDestroy();
}
// Called when the Fragment has been detached from its parent Activity.
@Override
public void onDetach() {
super.onDetach();
}
}
источник: Профессиональная разработка Android 4 - Reto Meier
Ответ 3
Вы всегда можете обрабатывать изменения ориентации с помощью onConfigurationChanged()
. См. Хороший пример здесь http://alexfu.tumblr.com/post/13926762386/android-dev-handling-fragment-recreation-manually