处理片段 Backstack 时 getOnBackPressedDispatcher 的问题

问题描述 投票:0回答:1

在我的单活动应用程序中,我实现了一项功能,在主活动中按后退按钮会触发延迟退出序列,在关闭应用程序之前显示“再见”消息。此功能按预期工作。但是,我遇到了一个问题:当按下后退按钮从片段导航回主活动时,应用程序退出,而不是返回主活动。

这是我在主要活动中设置后按的方法:

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

    getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
        @Override
        public void handleOnBackPressed() {
            exitAppWithDelay();
        }
    });
}

private void exitAppWithDelay() {
        recyclerView.setVisibility(View.GONE);
        appBarLayout.setVisibility(View.GONE);
        goodbyText.setVisibility(View.VISIBLE);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {

                finish(); // Finish the MainActivity after starting the GoodbyeScreen
            }
        }, EXIT_DELAY);
    }

此外,当从主活动导航到片段时,以下是代码:

private void openFragmentBasedOnPosition(int position) {
    FragmentTransaction transaction = fragmentManager.beginTransaction();

    Fragment fragment = null;
    String fragmentTag = null;

    switch (position) {
          case 0:
                fragment = new make_everything_ok_btn();
                fragmentTag = "make_everything_ok_btn";
                break; // And then other cases 

    }

    if (fragment != null) {
        transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out,android.R.anim.fade_in, android.R.anim.fade_out);
        transaction.replace(R.id.fragment_container, fragment, fragmentTag);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}

在特定片段中,我有一个按钮单击侦听器,可以重新启动片段:

continueBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        requireActivity().getSupportFragmentManager().popBackStack();
        FragmentTransaction transaction = requireActivity().getSupportFragmentManager().beginTransaction();
        transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out,android.R.anim.fade_in, android.R.anim.fade_out);                
        transaction.replace(R.id.fragment_container, new make_everything_ok_btn());
        transaction.addToBackStack(null);
        transaction.commit();
    }
});

问题似乎是由后退按钮处理机制与片段导航冲突引起的。我不确定为什么会出现这个问题,特别是因为在主活动中实现后退按钮处理之前它不存在。

java android android-fragments activity-lifecycle onbackpressed
1个回答
0
投票

将下面的 onBackPressed() 添加到活动中,它会完成您的任务。按一次后退按钮将显示再见消息,单击两次将关闭应用程序。

第二个事物片段(子)存在于活动(父)中。

public class MainActivity extends AppCompatActivity {

    private boolean backButtonPressed = false;

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

    }

    @Override
    public void onBackPressed() {
        if (backButtonPressed) {
            super.onBackPressed();
        } else {
            showToastAndExit("Goodbye! And press again to exit.");
            backButtonPressed = true;
            // Start delayed exit
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    backButtonPressed = false;
                }
            }, 2000);
        }
    }

    private void showToastAndExit(String message) {
        Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.