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?
Sie rufen irgendwie zweimal begehen. – Mike
Hier finden Sie Hilfe zum Verfassen einer guten Frage/Debugging-Probleme wie diese: http://stackoverflow.com/help/mcve – nhouser9
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. –