12

Ich habe mehrere Fragmente in meinem Projekt verwendet. Ich möchte den Zustand eines Fragments retten und diesen Zustand wiederherstellen, wenn ich darauf zurück komme. In diesem Fragment zeige ich mehrere Bilder, die sich bei einem Klick ändern. Ich verwende den folgenden Code dafür:Android Fragment Zurück Stack

String backStateName = fragment.getClass().getName(); 
FragmentManager fragmentManager = getSupportFragmentManager(); 
boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0); 
if (!fragmentPopped) { 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.replace(R.id.container_body, fragment); 
fragmentTransaction.addToBackStack(backStateName); 
fragmentTransaction.commit(); 
} 

Es funktioniert gut & es spart Zustand, aber es zeigt nicht vorheriges Bild des.

Jede Hilfe, Vorschlag oder Tutorials würde sehr geschätzt werden. Vielen Dank.

+0

'fragmentTransaction.addToBackStack (null);' –

+0

http://stackoverflow.com/a/15966777/1168654 –

+0

, warum Sie für Bilder verwenden glide Dont? Es speichert das Bild im Cache –

Antwort

1

verwenden kann ich mit der Fragmentliste versuche .. ..

Initiieren der framents Liste

static List<String> fragments = new ArrayList<String>(); 

Code-Fragment ändern und nehmen in zurück Stapel

String backStateName = fragment.getClass().getName(); 
    FragmentManager manager = getSupportFragmentManager(); 
    //fragment not in back stack, create it. 
    FragmentTransaction ft = manager.beginTransaction(); 
    if(!fragments.contains(backStateName)) { 

     // ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     // ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out); 
     ft.replace(R.id.frame, fragment); 
     ft.addToBackStack(backStateName); 
     ft.commit(); 

     fragments.add(backStateName); 
     System.out.println("backStateName" + fragments); 
    } 
    else 
    { 


     ft.replace(R.id.frame, fragment); 
     ft.commit(); 

    } 

onBackpressed

@Override 
public void onBackPressed() { 
    if(fragments.size()>0) 
     { 
      fragments.remove(fragments.size()-1); 
     } 
     super.onBackPressed(); 
} 

für Rücken entfernen Stapel

final android.app.FragmentManager fm = getFragmentManager(); 

    fm.addOnBackStackChangedListener(new android.app.FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 

      if (getSupportFragmentManager().getBackStackEntryCount() ==0) { 
       // dLayout.closeDrawers(); 
       finish(); 
      } 
      else 
      { 
       // dLayout.closeDrawers(); 

      } 
     } 
    }); 
0

Sie können den folgenden Code verwenden. Es wird nicht das Fragment nachladen, wenn Sie aus früheren Fragment zurückkommen:

if (!fragmentPopped) { 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.hide(getFragmentManager().findFragmentById(R.id.container_body)); 
    fragmentTransaction.add(R.id.container_body, fragment); 
    fragmentTransaction.addToBackStack(backStateName); 
    fragmentTransaction.commit(); 
    } 
0

Sie

fragmentTransaction.hide(getFragmentManager().findFragmentById(R.id.frame_container)); 
fragmentTransaction.add(R.id.frame_container, fragment); 
fragmentTransaction.addToBackStack(null); 

Statt

fragmentTransaction.replace(R.id.container_body, fragment); 
fragmentTransaction.addToBackStack(backStateName); 
0

ich mehrere Fragmente mit diesem code.Put diesen Code in Ihre MainActivity verwendet, wo ist dein framelayout oder Fragment.

@Override  
public void onBackPressed() { 
    /* Fragment fragment = new SettingActivity(); 
    String title = getString(R.string.app_name); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.container_body, fragment); 
    fragmentTransaction.commit(); 
    // set the toolbar title 
    getSupportActionBar().setTitle(title);*/ 
    //Log.e("title:", getTitle().toString()); 
    getSupportActionBar().setTitle("Home"); 
    //Log.e("title:", getTitle().toString()); 
    if (!getTitle().toString().equals("Home")) { 

     Fragment fragment = new Activity_category(); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.container_body, fragment).commit(); 
     this.setTitle("Home"); 
    } else { 

     super.onBackPressed(); 

    } 
} 

Möge dies Ihnen helfen.

0

Wenn Sie die Bilder im Androiden-Disk-Cache speichern können, wenn Sie das Fragment öffnen und die Bilder anzeigen, indem Sie aus dem Disk-Cache lesen, kann das Problem möglicherweise behoben werden. Folgen Sie dem untenstehenden Link von Google, um Bilder im Festplatten-Cache zu speichern.

https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

Im Folgenden sind die Schritte i denke, Sie sollten folgen.

  1. Speichern Sie Ihre Bilder im Festplattencache.
  2. onAbhängen Ihrer ImagesFragment an die Aktivität Lesen Sie die Bilder aus dem Festplattencache und zeigen Sie sie
  3. Wenn das Fragment aus dem Backstack herausgefallen ist, liest Ihr Code automatisch die Bilder aus dem Festplattencache.

Hoffe, das hilft.

0

Sie nehmen Ihr Fragment im Backstack, damit es nicht an Ihrem Fragment liegt, müssen Sie Ihre Image-Bibliothek einchecken. Darf ich wissen, welche Bibliothek Sie benutzen? Ich empfahl Picasso Bibliothek zu benutzen. Ich benutze das auch und erhalte Status gespeichertes Bild in meinem Fragment.

http://square.github.io/picasso/

0

Sie können unter Code mithilfe von Kreis Navigation tun. Sie können sogar zwei Fragmente als umgekehrt endlos besuchen.

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    hideLastFragment(fragmentTransaction); 
    fragmentTransaction.add(R.id.profile_fragmentContainer, youfFragment, fragmentTagName).addToBackStack(fragmentTagName); 
    fragmentTransaction.commitAllowingStateLoss(); 

    /** 
     * To hide the last fragment 
     * 
     * @param fragmentTransaction FragmentTransaction 
     */ 
     public void hideLastFragment(FragmentTransaction fragmentTransaction) { 
      final int backStackCount = getSupportFragmentManager().getBackStackEntryCount() - 1; 
      if (backStackCount >= 0) { 
       String fragmentName = getSupportFragmentManager().getBackStackEntryAt(backStackCount).getName(); 
       Fragment lastFragment = getSupportFragmentManager().findFragmentByTag(fragmentName); 
       fragmentTransaction.hide(lastFragment); 
      } 
     } 
Verwandte Themen