2016-09-14 5 views
3

Ich habe die anderen Antworten gesucht, wie ein Fragment in einem ViewPager ersetzt werden kann, aber ohne Erfolg.Fragment in ViewPager ersetzen - NPE bekommen

Das Setup ist das übliche, ich habe 2 Fragmente.

[Fragment1] [Fragment2]

in der Aktionsleiste ich eine Suchtaste haben, die im Overlay-Modus (Google-Suche), dann in onActivityResult eine neue Intent beginnt würde Ich mag das aktuelle Fragment mit dem neuen Fragment ersetzen .

Ich habe die SearchFragment abgeschlossen und es funktioniert, wenn ich es als 3. Fragment in den Registerkarten hinzufügen. Ich möchte jedoch nur Fragment2 durch das neue Suchfragment ersetzen.

Ich habe eine sectionsPagerAdapter-Klasse, die hilft.

Also, wenn ich das search in der Aktionsleiste klicken habe ich diesen Code in onActivityResult Brennen()

SearchFragment searchFragment = new SearchFragment(); 
    FragmentManager fm = getSupportFragmentManager(); 
    fm.beginTransaction().replace(R.id.container, searchFragment) 
         .addToBackStack(null) 
         .commit(); 

Doch die App stürzt mit einem Fehler:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { (has extras) }} to activity {com.example.app/com.example.MainActivityTabs}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 

at com.example.MainActivityTabs.onActivityResult(MainActivityTabs.java:168) 

168 die .commit ist ();

Wenn ich die Fragment-Transaktion feuern, wenn die Taste gedrückt wird, stürzt es zumindest nicht ab, aber es löscht beide Fragmente im Pager. Ich denke also, dass es zwei Probleme gibt.

Dank

+0

fügen Sie Ihre Ansicht Pager und Adapter Code auch – USKMobility

+0

p OST Ihr voller Code –

+0

in 'onactivityResult()' verwenden Sie eine Ansicht oder einen Handler, um eine ausführbare Runnable und in diesem runnable diese Aufgabe zu buchen. Wie: 'new Handler(). Post (neu Runnable() {});' –

Antwort

0

ich durch gleiche Problem kam, wird es nicht funktionieren, wenn Sie ein Fragment in einem

onActivityResult() begehen Aber Sie können dies für mehr über Fragment Transaktionen

boolean replaceFragment=false; 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     replaceFragment = true; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    if (replaceFragment) { 
     replaceFragment = false; 
     //do your fragment transaction in handler with some time 
     new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        //Do your fragment transaction here 
       } 
     }, 500); 
    } 
} 

durch erzielen und der Fehler siehe https://medium.com/@bherbst/the-many-flavors-of-commit-186608a015b1#.9gnzh4wqi

+0

Danke, Ja, von onResume aus zu telefonieren. –

Verwandte Themen