0

J'ai 3 Fragment (Fragment Home, Fragment A, Fragment B et Fragment C). La première exécution de l'application affichera Fragment Home (Set in Mainactivity). A partir de Navigation Draw Item peut choisir chaque fragment. Chaque élément sélectionné affichera Fragment de détail.Comment gérer la rotation de l'écran et sauvegarder les données dans Fragment?

J'ai des problèmes pour gérer les données et retenir fragment:

(1). Quand je sélectionne un fragment (par exemple Fragment A) montrera la page du Fragment A. Mais quand je tourne l'appareil, pourquoi mon fragment revient à Fragment Home et ne reste pas au Fragment actuel? Comment le gérer?

(2). Dans le fragment B, je montre l'image dans GridView. Mais quand je tourne l'appareil, pourquoi mon fragment de retour à Fragment Home et ne pas rester à Fragment actuel ?? Comment le gérer et toujours afficher ce fragment avec des données existantes?

Ceci est mon code:

public class MainActivity extends AppCompatActivity 
    implements NavigationView.OnNavigationItemSelectedListener { 

private static final String LOG_TAG = MainActivity.class.getSimpleName(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
     this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.syncState(); 

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
    navigationView.setNavigationItemSelectedListener(this); 

    displaySelectedItem(R.id.nav_home); 
} 

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    // Handle navigation view item clicks here. 
    displaySelectedItem(item.getItemId()); 

    return true; 
} 

private void displaySelectedItem (int itemId) { 
    Fragment fragment = null; 

    switch (itemId){ 
     case R.id.nav_home: 
      fragment = new FragmentHome(); 
      break; 
     case R.id.nav_a: 
      fragment = new FragmentA(); 
      break; 
     case R.id.nav_b: 
      fragment = new FragmentB(); 
      break; 
     case R.id.nav_c: 
      fragment = new FragmentC(); 
      break; 
     case R.id.nav_d: 
      fragment = new FragmentD(); 
      break; 
    } 

    FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager(); 
    List<Fragment> fragments = fragmentManager.getFragments(); 
    if (fragments != null) { 
     for(Fragment f : fragments){ 
      fragmentManager.popBackStack(); 

     } 
    } 


    //replace the fragment 
    if (fragment != null) { 
     FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
     fragmentTransaction.replace(R.id.content_frame, fragment, "TAG_FRAGMENT"); 
     fragmentTransaction.commit(); 
    } 

    DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawerLayout.closeDrawer(GravityCompat.START); 
} 

Fragment A:

public class FragmentA extends Fragment { 
public FragmentA() { 
    super(); 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_a, container, false); 
    return rootView; 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    getActivity().setTitle("Fragment A"); 
} 
} 

Fragment B:

public class FragmentB extends Fragment { 
private static final String LOG_TAG = FragmentB.class.getSimpleName(); 

private ImageAdapter imageAdapter; 
private ArrayList<Movie> movieList; 

public FragmentNowPlaying() { 
    super(); 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_b, container, false); 
    GridView gridView = (GridView) rootView.findViewById(R.id.gridviewNowPlaying); 

    imageAdapter = new ImageAdapter(getContext(), R.layout.fragment_b, movieList); 
    if (savedInstanceState == null) { 
     movieList = new ArrayList<Movie>(); 
    }else{ 
     movieList = (ArrayList<Movie>) savedInstanceState.get("MovieList"); 
    } 

    gridView.setAdapter(imageAdapter); 
    return rootView; 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    outState.putParcelableArrayList("MovieList",movieList); 
    super.onSaveInstanceState(outState); 
} 
+0

cadre try fragments 'setRetainInstance (true)' [ce qui se passe exactement dans retainStateTrue()] (http://stackoverflow.com/questions/12640316/further-understanding-setretaininstancetrue –

+0

@EmdadHossain essaie déjà mais ne peut toujours pas. Pouvez-vous donner un exemple? –

Répondre

0

Vous devez remplacer onConfigurationChanged(Configuration newConfig) méthode dans votre fragments A et B pour leur dire d'y rester quand la configuration de l'application n changer. Par exemple:

 @Override 
     public void onConfigurationChanged(Configuration newConfig) { 
       super.onConfigurationChanged(newConfig); 
       // get current fragment 
       Fragment fragment = mAdapter.getItem(currentItem); 
       if(fragment!=null){ 
        fragment.onResume(); 
       } 
     } 
0

Parce que chaque fois que vous faites pivoter l'écran la méthode onCreate() est appelée.

travail autour

dans onCreate() de vérification méthode si le savedInstanceState() est nulle ou non

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if(null == savedInstanceState){ 
      //set you initial fragment object 
     } 
    else 
     { 
     //Load the fragment by tag 
     } 
    } 

et d'enregistrer l'état de l'instance juste avant OnPause() dans tous les fragments

@Override 
protected void onSaveInstanceState(Bundle bundle1) 
{ 
super.onSaveInstanceState(bundle1); Log.i(tag,"inside onSaveInstanceState");  
bundle1.putInt("tag",n); 

} 
0

Résolu ce problème. Dans MainActivity, ajoutez ceci:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt(STATE_SELECTED_POSITION, mCurrentSelectedPosition); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    mCurrentSelectedPosition = savedInstanceState.getInt(STATE_SELECTED_POSITION, 0); 
    Menu menu = navigationView.getMenu(); 
    menu.getItem(mCurrentSelectedPosition).setChecked(true); 
} 

Dans chaque fragment, ajoutez une condition pour vérifier savedInstanceState null ou non.

Merci à tous