在我的单活动应用程序中,我实现了一项功能,在主活动中按后退按钮会触发延迟退出序列,在关闭应用程序之前显示“再见”消息。此功能按预期工作。但是,我遇到了一个问题:当按下后退按钮从片段导航回主活动时,应用程序退出,而不是返回主活动。
这是我在主要活动中设置后按的方法:
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();
}
});
问题似乎是由后退按钮处理机制与片段导航冲突引起的。我不确定为什么会出现这个问题,特别是因为在主活动中实现后退按钮处理之前它不存在。
将下面的 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();
}
}