2017-02-02 2 views
-1

Ich schreibe eine einfache App, um Java zu lernen, insbesondere, wie man Fragment-Transaktionen zu verwalten.Android Absturz während Fragment ersetzen Aktion

Die App verfügt über eine MainActivity und drei Fragmente (FragmentDefault, die MainActivity standardmäßig hinzugefügt wird und Fragmente eins und zwei, die bei einem Klick in MainActivity hinzugefügt werden können).

Meine App kann Fragment-Transaktion verarbeiten, stürzt jedoch während der zweiten ab, unabhängig von der Reihenfolge der Transaktionen.

Die MainActivity.java Datei ist wie folgt:

package com.example.connor.fragmenttestapp; 
 

 
import android.content.SharedPreferences; 
 
import android.support.v4.app.FragmentTransaction; 
 
import android.support.v7.app.AppCompatActivity; 
 
import android.os.Bundle; 
 
import android.view.View; 
 

 
public class MainActivity extends AppCompatActivity { 
 
    FragmentDefault fragDefault = new FragmentDefault(); 
 
    Fragment1 frag1 = new Fragment1(); 
 
    Fragment2 frag2 = new Fragment2(); 
 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
 

 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_main); 
 

 
     if (savedInstanceState == null) { 
 
      getSupportFragmentManager() 
 
        .beginTransaction() 
 
        .add(R.id.fragment_container, fragDefault) 
 
        .commit(); 
 
     } 
 
    } 
 

 
    public void openFrag(View view) { 
 
    transaction.replace(R.id.fragment_container, frag1); 
 
     transaction.commit(); 
 
     transaction.addToBackStack(null); 
 

 
    } 
 

 
    public void openFrag2(View view) { 
 
    transaction.replace(R.id.fragment_container, frag2); 
 
     transaction.commit(); 
 
     transaction.addToBackStack(null); 
 
    } 
 
}

mit XML-Datei:

package com.example.connor.fragmenttestapp; 
 

 
import android.content.SharedPreferences; 
 
import android.support.v4.app.FragmentTransaction; 
 
import android.support.v7.app.AppCompatActivity; 
 
import android.os.Bundle; 
 
import android.view.View; 
 

 
public class MainActivity extends AppCompatActivity { 
 
    FragmentDefault fragDefault = new FragmentDefault(); 
 
    Fragment1 frag1 = new Fragment1(); 
 
    Fragment2 frag2 = new Fragment2(); 
 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
 

 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_main); 
 

 
     if (savedInstanceState == null) { 
 
      getSupportFragmentManager() 
 
        .beginTransaction() 
 
        .add(R.id.fragment_container, fragDefault) 
 
        .commit(); 
 
     } 
 
    } 
 

 
    public void openFrag(View view) { 
 
    transaction.replace(R.id.fragment_container, frag1); 
 
     transaction.commit(); 
 
     transaction.addToBackStack(null); 
 

 
    } 
 

 
    public void openFrag2(View view) { 
 
    transaction.replace(R.id.fragment_container, frag2); 
 
     transaction.commit(); 
 
     transaction.addToBackStack(null); 
 
    } 
 
}

Meine drei Fragment-Dateien im Wesentlichen identisch mit Java-Dateien sind:

package com.example.connor.fragmenttestapp; 
 

 
import android.content.Context; 
 
import android.content.SharedPreferences; 
 
import android.net.Uri; 
 
import android.os.Bundle; 
 
import android.support.v4.app.Fragment; 
 
import android.view.LayoutInflater; 
 
import android.view.View; 
 
import android.view.ViewGroup; 
 

 

 
public class Fragment1 extends Fragment { 
 
    @Override 
 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
 
          Bundle savedInstanceState) { 
 
     //Inflate the layout for this fragment 
 
     return inflater.inflate(R.layout.fragment_fragment1, container, false); 
 
    } 
 

 
    @Override 
 
    public void onAttach(Context context) { 
 
     super.onAttach(context); 
 
    } 
 
}

und .XML-Dateien:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 
    xmlns:tools="http://schemas.android.com/tools" 
 
    android:layout_width="match_parent" 
 
    android:layout_height="match_parent" 
 
    tools:context="com.example.connor.fragmenttestapp.Fragment1"> 
 

 
    <TextView 
 
     android:layout_width="match_parent" 
 
     android:layout_height="match_parent" 
 
     android:gravity="center" 
 
     android:text="@string/frag1_text" 
 
     android:id="@+id/textView" /> 
 

 

 
</FrameLayout>

Die logcat Datei für diesen Fehler zeigt:

02-01 21: 01: 15.413 bis 15.413 51,608/com.example.connor.fragmenttestapp E/Android Runtime: fatal EXCEPTION: main Prozess: com.example.connor.fragmenttestapp, PID: 15413 java.lang.IllegalStateException : Konnte die Methode für Android nicht ausführen: onClick bei android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick (AppCompatViewInFlater.java:293) bei android.view.View.performClick (View.java:5702) bei android .widget.TextView.performClick (TextView.java:10896) bei android.view.View $ PerformClick.run (View.java:22546) bei android.os.Handler. handleCallback (Handler.java:739) bei android.os.Handler.dispatchMessage (Handler.java:95) bei android.os.Looper.loop (Looper.java:158) bei android.app.ActivityThread.main (ActivityThread.java:7224) bei java.lang.reflect.Method.invoke (native Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java: 1230) bei com.android.internal .os.ZygoteInit.main (ZygoteInit.java:1120) Verursacht von: java.lang.reflect.InvocationTargetException bei java.lang.reflect.Method.invoke (systemeigene Methode) bei android .support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick (AppCompatViewInFlater.java:288) bei android.view.View.performClick (View.java: 5702) bei android.widget.TextView.performClick (TextView.java:10896) bei android.view.View $ PerformClick.run (View.java:22546) bei android.os.Handler.handleCallback (Handler. java: 739) bei android.os.Handler.dispatchMessage (Handler.java:95) bei android.os.Looper.loop (Looper.java:158) bei android.app.ActivityThread.main (ActivityThread.java: 7224) bei java.lang.reflect.Method.invoke (native Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1230) bei com.andro id.internal.os.ZygoteInit.main (ZygoteInit.java:1120) Verursacht von: java.lang.IllegalStateException: commit bereits bei android.support.v4.app.BackStackRecord.commitInternal (BackStackRecord.java:630) bei android.support.v4.app.BackStackRecord.commit (BackStackRecord.java:603) bei com.example.connor.fragmenttestapp.MainActivity.openFrag2 (MainActivity.java:37) bei java.lang.reflect.Method.invoke (Native Methode) bei android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick (AppCompatViewInFlater.java:288) bei android.view.View.performClick (View.java:5702) bei android.widget.TextView.performClick (TextView.java:10896) bei android.view.View $ PerformClick.run (View.java:22546) bei android.os.Handler.handleCallback (Handler.java:739) bei android.os.Handler.dispatchMessage (Handler.java:95) bei android.os.Looper.loop (Looper.java:158) bei android.app.ActivityThread.main (ActivityThread.java:7224) bei java .lang.reflect.Method.invoke (Native Methode) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1230) bei com.android.internal.os.ZygoteInit.main (ZygoteInit. Java: 11 20)

Was diesen Fehler verursacht, und wie kann ich das beheben Sie den Code ein, es zu vermeiden?

+0

Sie rufen irgendwie zweimal begehen. – Mike

+0

Hier finden Sie Hilfe zum Verfassen einer guten Frage/Debugging-Probleme wie diese: http://stackoverflow.com/help/mcve – nhouser9

+0

Sie verwenden überall die gleiche 'FragmentTransaction'. Tu das nicht. Rufen Sie einfach 'beginTransaction()' jedes Mal auf, wenn Sie eine benötigen. Und verschieben Sie die 'addToBackStack()' Aufrufe vor den 'commit()' Aufrufen. –

Antwort

0

Sie benötigen eine Transaktion jedes Mal, statt der Schaffung einer nur zu beginnen.

Sie können einen einzelnen FragmentManager verwenden, müssen jedoch jedes Mal mit Transition beginnen.

package com.example.connor.fragmenttestapp; 
 

 
import android.content.SharedPreferences; 
 
import android.support.v4.app.FragmentTransaction; 
 
import android.support.v7.app.AppCompatActivity; 
 
import android.os.Bundle; 
 
import android.view.View; 
 

 
public class MainActivity extends AppCompatActivity { 
 
    FragmentDefault fragDefault = new FragmentDefault(); 
 
    Fragment1 frag1 = new Fragment1(); 
 
    Fragment2 frag2 = new Fragment2(); 
 
    FragmentManager fm; 
 

 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_main); 
 
     fm = = getSupportFragmentManager(); 
 
     if (savedInstanceState == null) { 
 
      fm.beginTransaction() 
 
        .add(R.id.fragment_container, fragDefault) 
 
        .commit(); 
 
     } 
 
    } 
 

 
    public void openFrag(View view) { 
 
    fm.beginTransition().replace(R.id.fragment_container, frag1) 
 
     .addToBackStack(null).commit(); 
 

 
    } 
 

 
    public void openFrag2(View view) { 
 
    fm.beginTransition().replace(R.id.fragment_container, frag2); 
 
     .addToBackStack(null).commit(); 
 
    } 
 
}

0

erstellen Sie dies jedes Mal, wenn Sie eine Transaktion machen möchten. transaction = getSupportFragmentManager(). BeginTransaction();

1

können Sie diese beiden Funktionen verwenden

public void openNoHistoryFragment(Fragment fragment) { 
      FragmentTransaction ft = getActivity().getSupportFragmentManager() 
        .beginTransaction(); 
      ft.replace(R.id.container, 
        fragment); 
      ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
      ft.commitAllowingStateLoss(); 
     } 

     public void openFragment(Fragment fragment) { 
      FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); 

      FragmentTransaction transaction = fragmentManager.beginTransaction(); 
//   transaction.setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit); 

      transaction.replace(R.id.container, fragment); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
     } 
Verwandte Themen