Android-事务提交失败

Android-事务提交失败,android,transactions,fragment,commit,Android,Transactions,Fragment,Commit,你好,我是Android领域的新手 我在使用FragmentTransaction更改片段时遇到问题,代码有什么问题? 据我所知,提交是个问题,因为它被调用了两次,但这似乎不可能,我在调试器中看不到这种行为 package com.example.foodgent.Logic; import android.annotation.SuppressLint; import android.widget.Button; import androidx.appcompat.app.AppCompa

你好,我是Android领域的新手

我在使用FragmentTransaction更改片段时遇到问题,代码有什么问题? 据我所知,提交是个问题,因为它被调用了两次,但这似乎不可能,我在调试器中看不到这种行为

package com.example.foodgent.Logic;

import android.annotation.SuppressLint;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.viewpager.widget.ViewPager;

import com.example.foodgent.UserInterface.Fragment2;
import com.example.foodgent.UserInterface.Fragment3;
import com.example.foodgent.UserInterface.MainActivity;
import com.example.fragment.R;

public class FragmentChanger<mainActivity>  extends AppCompatActivity {

    private Button btnNavFrag1;
    private Button btnNavFrag2;
    private Button btnNavFrag3;
    private MainActivity mainActivity;
    private int currentPage;
    public FragmentChanger(Button btnNavFrag1, Button btnNavFrag2, Button btnNavFrag3, MainActivity activity) {
        this.btnNavFrag1 = btnNavFrag1;
        this.btnNavFrag2 = btnNavFrag2;
        this.btnNavFrag3 = btnNavFrag3;
        this.mainActivity= mainActivity;
        currentPage=0;
    }



    @SuppressLint("RestrictedApi")
    public void change(int number, ViewPager viewPager){

   final FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

    switch (number) {
            case 0:
                if (currentPage != 0) {
                    btnNavFrag1.setBackgroundResource(R.drawable.fragment_active_button);
                    btnNavFrag2.setBackgroundResource(R.drawable.fragment_buttons);
                    btnNavFrag3.setBackgroundResource(R.drawable.fragment_buttons);

                    // Replace whatever is in the fragment_container view with this fragment,
                    // and add the transaction to the back stack if needed
                    transaction.replace(R.id.fragment, new Fragment());

                    transaction.addToBackStack(null);
                    transaction.commit();
                }
                break;

            case 1:
                if (currentPage != 1) {
                    btnNavFrag1.setBackgroundResource(R.drawable.fragment_buttons);
                    btnNavFrag2.setBackgroundResource(R.drawable.fragment_active_button);
                    btnNavFrag3.setBackgroundResource(R.drawable.fragment_buttons);

                    // Replace whatever is in the fragment_container view with this fragment,
                    // and add the transaction to the back stack if needed
                    transaction.replace(R.id.fragment, new Fragment2());

                    transaction.addToBackStack(null);
                    transaction.commit();
                }
                break;
            case 2:

                if (currentPage != 2) {
                    btnNavFrag1.setBackgroundResource(R.drawable.fragment_buttons);
                    btnNavFrag2.setBackgroundResource(R.drawable.fragment_buttons);
                    btnNavFrag3.setBackgroundResource(R.drawable.fragment_active_button);


                    // Replace whatever is in the fragment_container view with this fragment,
                    // and add the transaction to the back stack if needed
                    transaction.replace(R.id.fragment, new Fragment3());

                    transaction.addToBackStack(null);
                    transaction.commit();
                    }

                break;

        }

        currentPage=number;
        //set the new Page
        viewPager.setCurrentItem(number);
    }

    public int getCurrentPage(){
        return currentPage;
    }
}
片段类:

package com.example.foodgent.UserInterface;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.example.fragment.R;


public class Fragment1 extends Fragment {

    private static final String TAG = "Fragment1";

    private Button btnNavFrag1;
    private Button btnNavFrag2;
    private Button btnNavFrag3;
    private Button btnNavSecondActivity;
    Activity mainActivity;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment1_layout, container, false);


            return view;

    }
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        if (activity != null) {
            try {
                mainActivity = activity;
            }
            catch (ClassCastException e) {
                Log.v(TAG, "Exception: " + e.getLocalizedMessage());
            }
        }
    }
}

您是否持有对该片段中活动的引用?尝试在片段的onAttach中保存/更新活动:

Android在设备轮换时保存、销毁和重新创建您的活动和片段,它可能会重用包含对已销毁活动的引用的片段


将对新活动的引用保存在onAttach中将更新该引用。

如果错误发生在transaction.commit时?然后,您可以通过检查活动是否未完成来将调用包含在内部

if (!this.isFinishing()){
        transaction.commit();
}

我删除了fragmentchanger类,并在Mainactivity中更改了片段


问题是transaction.commit,因为我不能在FragmentChanger中多次调用它,在按下Tab按钮后出现错误。

好的,我在Fragment类中给出了这段代码。问题是mainActivity始终为null,那么我缺少什么部分?将在接下来的几分钟内添加代码FragmentChanger类显然未被用作活动,因此不应扩展任何活动类。从类声明中移除扩展的AppCompatActivity,您将看到问题的根源在哪里;i、 不,问题是您自己直接实例化了一个活动类。你不能这样做,让它正常工作。系统必须处理活动实例化;否则它没有正确初始化,在堆栈跟踪中会出现类似的错误。您仍然可以使用FragmentChanger帮助器,但是对于任何需要活动的内容,您都需要使用在构造函数中传递的MainActivity,比如getSupportFragmentManager调用。仅供参考。谢谢。我试试看!在主要活动中有这么多东西,使得把东西聚在一起越来越难了!
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);

    if (activity != null) {
        try {
            mainActivity = activity;
        }
        catch (ClassCastException e) {
            Log.v(TAG, "Exception: " + e.getLocalizedMessage());
        }
    }
}
if (!this.isFinishing()){
        transaction.commit();
}