动态关闭一个Activity和片段

时间:2017-10-30 08:41:26

标签: android android-fragments

这是我的第一个问题。我使用下面的代码删除片段:

    private boolean returnBackStackImmediate(FragmentManager fm) {

        List<Fragment> fragments = fm.getFragments();
        if (fragments != null && fragments.size() > 0) {
            for (Fragment fragment : fragments) {
                if (fragment.getFragmentManager().getBackStackEntryCount() > 0) {
                    if (fragment.getFragmentManager().popBackStackImmediate()) {
                        return true;
                    } else {
                        return returnBackStackImmediate(fragment.getChildFragmentManager());
                    }
                }
            }
        }


    return false;
}

现在,我希望在删除片段后,如果用户再次点击后退按钮,我的活动就会关闭。因为我已将这些代码添加到我的活动中:

    @Override
public void onBackPressed() {

    if (getSupportFragmentManager().getFragments() == null) {
        finish();
    } else {

        if (!returnBackStackImmediate(getSupportFragmentManager())) {
            super.onBackPressed();
        }
    }

}

但是当我按下后退按钮并删除片段并再次按下时我收到此错误:

 java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentManager android.support.v4.app.Fragment.getFragmentManager()' on a null object reference
                                                                             at com.safarayaneh.notify.activities.MainActivity.returnBackStackImmediate(MainActivity.java:501)
                                                                             at com.safarayaneh.notify.activities.MainActivity.onBackPressed(MainActivity.java:488)
                                                                             at android.app.Activity.onKeyUp(Activity.java:2477)
                                                                             at android.view.KeyEvent.dispatch(KeyEvent.java:2664)
                                                                             at android.app.Activity.dispatchKeyEvent(Activity.java:2730)

我知道片段为空但我可以在这种情况下使用哪种条件?

3 个答案:

答案 0 :(得分:4)

试试这个

@Override
public void onBackPressed() {

    int count = getSupportFragmentManager().getBackStackEntryCount();

    if (count == 0) {
        super.onBackPressed();

    } else {
         getSupportFragmentManager().popBackStackImmediate();
    }

}

答案 1 :(得分:0)

使用getActivity()。finish();从片段

完成活动
getActivity().finish();

答案 2 :(得分:0)

我不确定您为什么要手动编写此代码。如果您将片段添加到活动中,如下所示:

  getSupportFragmentManager().beginTransaction().replace(R.id.***YOUR TARGET FRAME ID***, fragment, "some fragment tag")
                .addToBackStack(null)
                .commit();

然后活动应该自动处理backstack的东西。即不需要对onBackPressed做任何事情。当Backstack中没有更多碎片时,活动将关闭。

如果有特殊原因你手动让我知道,我会删除这个答案(但你可能需要更新问题,因为这个简单的方法确实回答了你的问题!)