簡體   English   中英

在導航抽屜中具有多個片段的活動中按后退按鈕時退出應用程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM