Fragment ViewState restored in onStart?

前端 未结 3 1982
长发绾君心
长发绾君心 2021-02-06 05:08

When orientation changes, fragment viewState restored only in onStart. After onAttach, onCreateView, onViewCreated

相关标签:
3条回答
  • 2021-02-06 05:43

    You can always handle orientation changes yourself with onConfigurationChanged(). See a nice example here http://alexfu.tumblr.com/post/13926762386/android-dev-handling-fragment-recreation-manually

    0 讨论(0)
  • 2021-02-06 05:50

    [EDIT 1 - - - - - - -]

    // Check to see if the Fragment back stack has been populated

    // If not, create and populate the layout.

    // so your fragment wont recreated

      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();
      }
    

    [EDIT 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's 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's 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's 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's 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();
      }
    }
    

    source : Professional Android Development 4 - Reto Meier

    0 讨论(0)
  • 2021-02-06 05:52

    In Android API >= 17 (Android 4.2 Jelly Beans) there is a method: public void onViewStateRestored (Bundle savedInstanceState)

    which is called before onStart() and after onActivityCreated() as mentioned in docs.

    In Android API < 17 there is no such method. But there are two solutions:

    1. Don't rely on view state while initializing Fragment and save all required initialization state as Fragment state (i.e. override Fragment#onSaveInstanceState()). Later you can restore fragment state in onCreate(), onCreateView() or onViewCreated().
    2. Perform initialization in onStart() as specified in question.
    0 讨论(0)
提交回复
热议问题