繁体   English   中英

片段替换操作期间Android崩溃

[英]Android crash during fragment replace action

我正在编写一个简单的应用程序来学习Java,特别是如何管理片段事务。

该应用程序具有一个MainActivity和三个片段(FragmentDefault,默认情况下添加到MainActivity;以及片段1和2,可以在单击MainActivity的按钮上添加片段)。

我的应用程序可以处理碎片交易,但是无论交易顺序如何,第二次崩溃。

MainActivity.java文件如下:

 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); } } 

.XML文件:

 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); } } 

我的三个片段文件与Java文件基本相同:

 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); } } 

和.XML文件:

 <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> 

此错误的logcat文件显示:

02-01 21:01:51.608 15413-15413 / com.example.connor.fragmenttestapp E / AndroidRuntime:致命例外:主进程:com.example.connor.fragmenttestapp,PID:15413 java.lang.IllegalStateException:无法执行方法适用于android:onClick,位于android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)位于android.view.View.performClick(View.java:5702),位于android.widget.TextView.performClick(TextView) .java:10896),位于android.view.View $ PerformClick.run(View.java:22546),位于android.os.Handler.handleCallback(Handler.java:739),位于android.os.Handler.dispatchMessage(Handler.java: 95)在android.os.Looper.loop(Looper.java:158)在android.app.ActivityThread.main(ActivityThread.java:7224)在com.android的java.lang.reflect.Method.invoke(本机方法) .internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)原因:java.lang上的java.lang.reflect.InvocationTargetException .r android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)上的eflect.Method.invoke(本机方法),android.widget处的android.view.View.performClick(View.java:5702) android.os.Handler.dispatchMessage上的android.view.View $ PerformClick.run(View.java:22546)上的android.os.Handler.handleCallback(Handler.java:739)上的TextView.performClick(TextView.java:10896) (Handler.java:95)在android.os.Looper.loop(Looper.java:158)在android.app.ActivityThread.main(ActivityThread.java:7224)在java.lang.reflect.Method.invoke(本机方法)com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)的原因:java.lang.IllegalStateException:提交已在com.example.connor.fragmenttestapp的android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:603)的android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:630)处调用。中号 位于android.view的java.lang.reflect.Method.invoke(本机方法)处的ainActivity.openFrag2(MainActivity.java:37),位于android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)处。 android.widget.TextView上的View.performClick(View.java:5702)android.os.Handler.handleCallback上的android.view.View $ PerformClick.run(View.java:22546)上的View.performClick(View.java:5702) (Handler.java:739)位于android.os.Handler.dispatchMessage(Handler.java:95)位于android.os.Looper.loop(Looper.java:158)位于android.app.ActivityThread.main(ActivityThread.java: 7224)在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1230)在java.lang.reflect.Method.invoke(本机方法)在com.android.internal.os.ZygoteInit.main( ZygoteInit.java:1120)

是什么导致此错误,我该如何修复代码以避免它?

您需要每次都开始一个事务,而不是仅创建一个事务。

您可以只有一个FragmentManager,但是每次都必须开始beginTransition。

 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(); } } 

您可以使用这两个功能

    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();
        }

每当您要进行交易时,请创建一个。 transaction = getSupportFragmentManager()。beginTransaction();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM