簡體   English   中英

Android:在背面按下返回上一個片段

[英]Android : Return to previous fragment on back press

我已經實現了Navigation Drawer,它是Activity的子類。 我的應用程序中有很多片段。 我的問題在這里

想象一下有3個片段:

Fragment_1:Fragment_2:Fragment_3

當我啟動我的應用程序時,Fragment_1被加載當我點擊Fragment_1上的一些組件時,我將導航到Fragment_2,依此類推。

所以它就像

Fragment_1> Fragment_2> Fragment_3

當我從Fragment_2按回鍵時,我被導航回Fragment_1但是當我從Fragment_3按回鍵時,我被導航回Fragment_1(而不是Fragment_2)

我在Back Key按下的應用程序中想要這樣的東西

Fragment_1 <Fragment_2 <Fragment_3

我使用Fragment,FragmentManager,FragmentTransaction如下:

MyFragment fragment = new MyFragment();
FragmentManager fragmentManager = getFragmentManager();

fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null)commit();

我嘗試在我的MainActivity中覆蓋onBackPressed():

@Override
public void onBackPressed() {


        getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        int count = getFragmentManager().getBackStackEntryCount();
        if (count == 0)
               super.onBackPressed();
    }

Activity#onBackPressed()方法更新為:

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}

你的實現不起作用的原因是因為FragmentManager#popBackStack()是異步的,並且在調用之后不會發生。

從文檔:

此函數是異步的 - 它將請求排入pop,但在應用程序返回其事件循環之前不會執行該操作。

參考: http//developer.android.com/reference/android/app/FragmentManager.html#popBackStack(java.lang.String,%20int)

您必須按照此處的說明實現自己的backstack實現

使用Fragments為Android中的每個選項卡分隔Back Stack

只要單擊片段中的后退按鈕,就可以調用popFragments(),只要從一個片段導航到另一個片段,就可以調用pushFragments()。

簡而言之,

public void onBackPressed()
{
    FragmentManager fm = getActivity().getSupportFragmentManager();
    fm.popBackStack();
}

FragmentManager#executePendingTransactions();FragmentManager#executePendingTransactions();

這也是我用於嵌套片段的原因......:

/**
 * if there is a fragment and the back stack of this fragment is not empty,
 * then emulate 'onBackPressed' behaviour, because in default, it is not working.
 *
 * @param fm the fragment manager to which we will try to dispatch the back pressed event.
 * @return {@code true} if the onBackPressed event was consumed by a child fragment, otherwise
 */
public static boolean dispatchOnBackPressedToFragments(FragmentManager fm) {

    List<Fragment> fragments = fm.getFragments();
    boolean result;
    if (fragments != null && !fragments.isEmpty()) {
        for (Fragment frag : fragments) {
            if (frag != null && frag.isAdded() && frag.getChildFragmentManager() != null) {
                // go to the next level of child fragments.
                result = dispatchOnBackPressedToFragments(frag.getChildFragmentManager());
                if (result) return true;
            }
        }
    }

    // if the back stack is not empty then we pop the last transaction.
    if (fm.getBackStackEntryCount() > 0) {
        fm.popBackStack();
        fm.executePendingTransactions();
        return true;
    }

    return false;
}

在我的onBackPressed

                if (!FragmentUtils.dispatchOnBackPressedToFragments(fm)) {
                    // if no child fragment consumed the onBackPressed event,
                    // we execute the default behaviour.
                    super.onBackPressed();
                }

在主活動中更改選項卡上使用此代碼以清除堆棧。

int count = getFragmentManager().getBackStackEntryCount();
        if(count>0){
            for (int i = 0; i <count; i++) {
                getFragmentManager().popBackStack();
            }
        }

然后在你的主要活動的背面按下這樣做

 int count = getFragmentManager().getBackStackEntryCount();

     if (count == 0) {
         super.onbackpressed();
        }
else {
        getFragmentManager().popBackStack();
    }
 }

這是我的工作和測試代碼,這將對您有所幫助

 private static final int TIME_INTERVAL = 2000;
private long mBackPressed;
 private void applyExit() {
    if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis()) {
        finish();
    } else {
         Toast.makeText(this,"Press Again to exit",Toast.LENGTH_LONG).show();
    }
    mBackPressed = System.currentTimeMillis();
}

@Override
public void onBackPressed() {
    fm = getSupportFragmentManager();
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    }
    if (fm.getFragments().size() <= 1) {
        applyExit();
    } else {
        for (Fragment frag : fm.getFragments()) {
            if (frag == null) {
                applyExit();
                return;
            }
            if (frag.isVisible()) {
                FragmentManager childFm = frag.getChildFragmentManager();
                if (childFm.getFragments() == null) {
                    super.onBackPressed();
                    return;
                }
                if (childFm.getBackStackEntryCount() > 0) {
                    childFm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    return;
                } else {
                    fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                    return;
                }
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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