![](/img/trans.png)
[英]How to exit the app when the user press back button in navigation component?
[英]Exit app when press Back button in activity with multiple fragments in Navigation Drawer
我正在開發一款需要導航抽屜的應用。 這個應用程序有1個MainActivity和大約10個片段。 當我單擊MainActivity中的導航抽屜圖標時,它將顯示10個片段,以便我可以選擇每個片段。
我選擇片段A,然后選擇B,然后選擇C ...到F。 當我在片段F並按下后退按鈕時,它會將我帶回片段E,然后再返回它將帶我片段D ...
我的問題是,當我回到片段A(當然是從片段B)並再次按下“返回”按鈕時,它會將我帶到一個空白的白色屏幕(我認為這是主要的活動布局)。 然后再按回來,應用程序將退出。
我想要的是當我回到片段A(最后一個片段)並點擊返回時,應用程序將立即退出,而不是空白的白色屏幕
我搜索了SO,發現了一個類似的問題,但還沒有答案,所以我不得不提出另一個問題
我怎樣才能做到這一點? 非常感謝你
只需在倒數第二個屏幕退出應用程序
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();
}
}
從你的Fragment A中刪除addToBackStack()。希望有所幫助。
我想我是另一個沒有回答的問題,所以我想告訴你我的解決方法:
我檢查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();
}
}
我剛剛解決了類似問題。 我改編了Ali Azhar的解決方案。 由於我有一個啟動畫面活動,我不想終止應用程序,否則當我嘗試恢復應用程序(按下手機上的活動應用程序按鈕並選擇應用程序)時,應用程序將卡在啟動畫面中沒有進入我的主要活動。 而不是
MainActivity.super.onBackPressed();
我用過這個:
moveTaskToBack(true);
顯示主屏幕。 我不需要用戶進行任何退出確認,因此我刪除了對話框代碼。 我還想調整我的replaceFragment(targetFragment,fragmentNameInBackStack)方法,以避免將片段添加到backstack,如果它是第一個片段,但事實證明沒有必要這樣做,因為我們讓管理器從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);
}
}
這是退出應用程序的簡便方法 ,只需粘貼下面的代碼即可
@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();
}
使用此..簡單的解決方案,但對我來說很完美。 在您點擊最后一個打開的片段后,這會關閉應用程序。
@Override
public void onBackPressed() {
if(getSupportFragmentManager().getBackStackEntryCount() == 1) {
moveTaskToBack(false);
}
else {
super.onBackPressed();
}
}
在onBack方法中檢查with片段管理器中沒有可用的片段...如果它的1,則使用move taskback方法關閉應用程序
我猜你可以避免按下后退按鈕或完成按下后退按鈕上的活動。一般情況下,如果你使用導航抽屜比這不是問題,但你可以嘗試。
@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/
這對我有用。
如果從MainActivity調用
supportFinishAfterTransition();
如果從片段調用
getActivity().supportFinishAfterTransition();
答案很晚。 但我希望至少幫助這個回答任何人。
在下面的代碼的幫助下,我實現了雙后退退出(它給Toast “請再次點擊返回退出”如果再次按下只有應用程序將退出。)
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;
這個對我有用(退出雙擊退出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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.