Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用事务回退来弹出片段?_Java_Android_Fragment_Fragment Backstack - Fatal编程技术网

Java 如何使用事务回退来弹出片段?

Java 如何使用事务回退来弹出片段?,java,android,fragment,fragment-backstack,Java,Android,Fragment,Fragment Backstack,假设我有一个带有FragmentContainerView的MainActivity。 此FragmentContainerView的大小与MainActivity匹配 然后我想在FragmentContainerView中一次显示一个片段 片段1、片段2和片段3 每个片段将有一个按钮。按下按钮时,加载下一个片段 片段1(按按钮)-->片段2(按按钮)-->片段3(按按钮)-->片段1-->依此类推 到目前为止,我已经能够实现了,但我不知道如何制作片段,当我按下后退按钮时 碎片1应该退出应用程序

假设我有一个带有FragmentContainerView的MainActivity。 此FragmentContainerView的大小与MainActivity匹配

然后我想在FragmentContainerView中一次显示一个片段

片段1、片段2和片段3

每个片段将有一个按钮。按下按钮时,加载下一个片段

片段1(按按钮)-->片段2(按按钮)-->片段3(按按钮)-->片段1-->依此类推

到目前为止,我已经能够实现了,但我不知道如何制作片段,当我按下后退按钮时

碎片1应该退出应用程序

碎片2应加载碎片1

碎片3应加载碎片2

这是我的主要活动

    public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FirstFragment fragment = new FirstFragment();
        Bundle bundle = new Bundle();
        bundle.putString("CLASS_NAME", " ");
        fragment.setArguments(bundle);
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container_view, fragment, null)
                .commit();
    }
}
这是我的片段1

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

       
        binding = FragmentFirstBinding.bind(getView());


        String previous_class = getArguments().getString("CLASS_NAME");
        if(!previous_class.equals(" ")){
            binding.textViewFirstFragment.setText(previous_class);
        }

        //On button click, navigate to MainActivity
        binding.buttonFirstFragment.setOnClickListener(this);
    }

@Override
    public void onClick(View v) {
        //Log.i("BACKSTACK", "debug: current status of fragment back stack " + getFragmentManager().getBackStackEntryCount());
        Fragment fragment = new SecondFragment();
        putBundleArgument(fragment);
        replaceFragment(fragment);
        debug();
    }

    public void replaceFragment(Fragment fragment) {
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.fragment_container_view, fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }
这是我的片段2

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

   
    binding = FragmentSecondBinding.bind(getView());

    String previous_class = getArguments().getString("CLASS_NAME");
    binding.textViewSecondFragment.setText(previous_class);
    //On button click, navigate to MainActivity
    binding.buttonSecondFragment.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    //Log.i("BACKSTACK", "debug: current status of fragment back stack " + getFragmentManager().getBackStackEntryCount());
    Fragment fragment = new ThirdFragment();
    putBundleArgument(fragment);
    replaceFragment(fragment);
    debug();
}

public void replaceFragment(Fragment fragment) {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container_view, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}
最后,这里是我的片段3

 @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    
    binding = FragmentThirdBinding.bind(getView());

    String previous_class = getArguments().getString("CLASS_NAME");
    binding.textViewThirdFragment.setText(previous_class);
    //On button click, navigate to MainActivity
    binding.buttonThirdFragment.setOnClickListener(this);
}

@Override
public void onClick(View v) {

    Fragment fragment = new FirstFragment();
    putBundleArgument(fragment);
    replaceFragment(fragment);
    debug();

}
public void replaceFragment(Fragment fragment) {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();

    /*
    ThirdFragment fragment3 = new ThirdFragment();
    transaction.remove(fragment3);
    SecondFragment fragment2 = new SecondFragment();
    transaction.remove(fragment2);
    */
    getFragmentManager().popBackStack();
    getFragmentManager().popBackStack();
    getFragmentManager().popBackStack();


    transaction.replace(R.id.fragment_container_view, fragment);
    transaction.addToBackStack(null);
    transaction.commit();

}

这就是使用
addToBackStack()
时片段已经为您做的事情。手动执行此操作绝对是错误的,并且无法处理嵌套片段。@ianhanniballake我100%同意这将导致未来的问题,但此解决方案源于他们现有的代码库。任何时候,我提出的解决方案都不能解决问题,但却导致了一个本来就没有解决方案的设计,我都会被否决。从表面上看,它对询问者有效。我最初没有发布的答案完全取消了链接片段的创建,这将导致一个更易于维护的控制结构。我认为这无论如何都不起作用-在FragmentThree时,这将弹出后堆栈(将您带到两个),并调用
super.onBackPressed()
这也将弹出片段回栈(将您带到一个),这不是您想要的。那么您的代码中的哪一步出错了?是你第一次使用FragmentOne的时候吗?在进入第二个片段并试图回到第一个片段之后?在第三段和第二段之后?还是回到一个?请具体说明。
 @Override // override this in MainActivity
 public void onBackPressed(){
     int count = getSupportFragmentManager().getBackStackEntryCount();
     if(count == 1)//When there is only 1 fragment left in the stack ie Fragment 1.
        finsh();
     else
        getSupportFragmentManager().popBackStack(); //Fragment 2 and 3 are popped here.
     super.onBackPressed();  
 }