我正在开发一款需要导航抽屉的应用。这个应用程序有1个MainActivity和大约10个片段。当我单击MainActivity中的导航抽屉图标时,它将显示10个片段,以便我可以选择每个片段。
我选择片段A,然后选择B,然后选择C ...到F。当我在片段F并按下后退按钮时,它会将我带回片段E,然后再返回它将带我去片段D ......
我的问题是,当我回到片段A(当然是来自片段B)并再次按下“返回”按钮时,它会将我带到一个空白的白色屏幕(我认为这是主要的活动布局)。然后再按回来,应用程序将退出。
我想要的是当我回到片段A(最后一个片段)并点击返回时,应用程序将立即退出,而不是空白的白色屏幕
我搜索了SO并找到了1个类似的问题,但还没有答案,所以我不得不提出另一个问题
我该怎么做? 非常感谢你
答案 0 :(得分:9)
在最后一个屏幕退出应用
public void onBackPressed() {
if (manager.getBackStackEntryCount() > 1 ) {
// If there are back-stack entries, leave the FragmentActivity
// implementation take care of them.
manager.popBackStack();
} else {
// Otherwise, ask user if he wants to leave :)
new AlertDialog.Builder(this)
.setTitle("Really Exit?")
.setMessage("Are you sure you want to exit?")
.setNegativeButton(android.R.string.no, null)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
MainActivity.super.onBackPressed();
}
}).create().show();
}
}
答案 1 :(得分:6)
从Fragment A中删除addToBackStack()。 希望有所帮助。
答案 2 :(得分:5)
我想我是另一个没有回答问题的人,所以我想告诉你我的解决方法:
我检查FrameLayout中是否有一个孩子。如果有的话,我会回去一个片段。然后再检查一下。因为我确实只知道白色屏幕,所以我需要在它之后检查0个孩子。如果还存在另一个片段,则无处可做,但如果childs == 0,则要求离开活动。
或者,如果您到达最后一个片段,则可以删除AlertDialog并关闭应用程序。
@Override
public void onBackPressed() {
FrameLayout fl = (FrameLayout) findViewById(R.id.content_frame);
if (fl.getChildCount() == 1) {
super.onBackPressed();
if (fl.getChildCount() == 0) {
new AlertDialog.Builder(this)
.setTitle("Close App?")
.setMessage("Do you really want to close this beautiful app?")
.setPositiveButton("YES",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
finish();
}
})
.setNegativeButton("NO",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
}
}).show();
// load your first Fragment here
}
} else if (fl.getChildCount() == 0) {
// load your first Fragment here
} else {
super.onBackPressed();
}
}
答案 3 :(得分:4)
我刚刚解决了类似的问题。我改编了Ali Azhar的解决方案。由于我有一个启动画面活动,我不想终止应用程序,否则当我尝试恢复应用程序(按下手机上的活动应用程序按钮并选择应用程序)时,应用程序将卡在启动屏幕而不进入我的主要活动。而不是
MainActivity.super.onBackPressed();
我用过这个:
moveTaskToBack(true);
显示主屏幕。我不需要用户进行任何退出确认,因此我删除了对话框代码。我还想调整我的 replaceFragment(targetFragment,fragmentNameInBackStack)方法,以避免将片段添加到backstack,如果它是第一个片段,但事实证明没有必要这样做,因为我们制作如果backstack中的一个片段更多,那么管理器会从后台弹出,所以如果只有一个片段,那就没问题了,我们就退出了。它很好,因为我想在不同的屏幕/片段之间保留我的后导航行为。所以这是代码:
@Override
public void onBackPressed() {
FragmentManager manager = getSupportFragmentManager();
if (manager.getBackStackEntryCount() > 1 ) {
manager.popBackStack();
} else {
// if there is only one entry in the backstack, show the home screen
moveTaskToBack(true);
}
}
答案 4 :(得分:1)
简单方法退出您的应用只需粘贴下面的代码
@Override
public void onBackPressed() {
FragmentManager manager = getSupportFragmentManager();
if (manager.getBackStackEntryCount() > 1) {
// If there are back-stack entries, leave the FragmentActivity
// implementation take care of them.
manager.popBackStack();
} else {
// Otherwise, ask user if he wants to leave :)
new AlertDialog.Builder(this)
.setTitle("Really Exit?")
.setMessage("Are you sure you want to exit?")
.setNegativeButton(android.R.string.no, null)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
// MainActivity.super.onBackPressed();
finish();
moveTaskToBack(true);
}
}).create().show();
}
答案 5 :(得分:1)
使用此方法。.简便的解决方法,但对我来说效果很好。您点击最后一个打开的片段后,将关闭应用程序。
@Override
public void onBackPressed() {
if(getSupportFragmentManager().getBackStackEntryCount() == 1) {
moveTaskToBack(false);
}
else {
super.onBackPressed();
}
}
答案 6 :(得分:0)
在onBack方法中,检查with片段管理器中没有可用的片段...如果它的1,则使用move taskback方法关闭应用程序
答案 7 :(得分:0)
我猜您可以避免按下后退按钮或按下后退按钮上的活动。一般情况下,如果您使用的是导航抽屉,那么根本不是问题,但您可以尝试。
@Override
public void onBackPressed()
{
// Do Here what ever you want do on back press;
}
或者你可以去导航抽屉 http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/
答案 8 :(得分:0)
这对我有用。
如果从MainActivity调用
supportFinishAfterTransition();
如果从片段
调用getActivity().supportFinishAfterTransition();
答案 9 :(得分:0)
很晚才回答。但我希望至少能帮到任何人。
在下面的代码的帮助下,我实现双后退退出(它给Toast &#34;请再次点击返回退出&#34; 如果再次按下则只有应用程序退出。)< / p>
getBackStackEntryCount() - 提供后台堆栈碎片的当前计数。
int backStackEntryCount = getSupportFragmentManager()。getBackStackEntryCount();
如果此值== 0,则后备堆栈中没有可用的片段。所以执行双后退退出代码。
否则允许使用 super.onBackPressed();
进行背压操作@Override
public void onBackPressed() {
int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount();
//backStackEntryCount==0 -> no fragments more.. so close the activity with warning
if (backStackEntryCount == 0){
if (homePressed) {
if (doubleBackToExitPressedOnce) {
super.onBackPressed();
return;
}
this.doubleBackToExitPressedOnce = true;
Toast.makeText(this, "Please click back again to exit", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
doubleBackToExitPressedOnce = false;
}
}, 2000);
} else {
homePressed = true;
}
}
//some fragments are there.. so allow the back press action
else {
super.onBackPressed();
}
}
全局声明这些变量
boolean homePressed = true, doubleBackToExitPressedOnce = false;
答案 10 :(得分:0)
这对我有用(退出双击以退出Fragment)
int backButtonCount = 0;
@SuppressLint({"ResourceAsColor", "ResourceType"})
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
//binding fragment view
view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener((v, keyCode, event) -> {
Log.i("Fragment_Home", "keyCode: " + keyCode);
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
Log.e(TAG, "onCreateView: " + "Fragment Hom Key up");
if (backButtonCount >= 1) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
getActivity().finish();
} else {
Toast.makeText(getContext(), "Please click BACK again to exit", Toast.LENGTH_SHORT).show();
backButtonCount++;
new Handler().postDelayed(() -> {
backButtonCount = 0;
}, 2000);
}