【问题标题】:How to avoid closing Activity when going to previous fragment转到上一个片段时如何避免关闭活动
【发布时间】:2018-01-16 06:05:58
【问题描述】:

我有一个由 2 个片段组成的活动,我在我的活动中写下的内容是这样的......

private Boolean exit = false;

@Override
public void onBackPressed() {
    if (exit) {
        moveTaskToBack(true);    
        finish(); // finish activity
    } else {
        Toast.makeText(this, "Press Back again to Exit.",
        Toast.LENGTH_SHORT).show();
        exit = true;
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                exit = false;
            }
        }, 3 * 1000);
    }
}

即使我在片段 2,这也会直接导致关闭应用程序,实际上应该发生的是它应该返回片段 1 而没有关闭任何帮助...

【问题讨论】:

  • 你能把你的代码从 Fragment1 发布到 Fragment2

标签: android fragment android-fragmentactivity


【解决方案1】:

使用这个:

@Override
public void onBackPressed() {

    int fragmentCount = getSupportFragmentManager().getBackStackEntryCount();
    if (fragmentCount == 1) {
        finish();
    } else {
        if (fragmentCount > 1) {
            getFragmentManager().popBackStack();
        } else {
            super.onBackPressed();
        }

    }
}

看看它是否有效。顺便说一句,这不是我的工作,但应该可以。

【讨论】:

  • 那个抽屉布局是什么??
【解决方案2】:

只需在这样的片段事务上使用 addToBackStack(null)

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

在活动onBackPressed()

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

希望这会对你有所帮助。

【讨论】:

    【解决方案3】:

    首先检查您是否将片段添加到stack。例如,如果您想从 FirstFragment 导航到 SecondFragment

    FragmentManager manager = getSupportFragmentManager();
    SecondFragment fragment = new SecondFragment();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.container, fragment).addToBackStack("tag");
    transaction.commit();
    

    然后在你的activity 覆盖onBackPressed 为,

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

    上述方法从FirstFragment 导航到SecondFragment,点击SecondFragment 上的后退按钮(如果片段堆栈为空,则在按下后退按钮时从活动返回)。

    编辑:- 并且总是尝试从活动开始一个片段。永远不要来自片段(这不是一个好习惯)。因为fragment本质上是一个activity的实例,所以它需要从一个activity上下文开始而不是fragment上下文来表现更好。

    例如,如果你想从FirstFragment 开始SecondFragment,那么在你的活动中创建一个方法,

    public void startSecondFragment(){
       FragmentManager manager = getSupportFragmentManager();
       SecondFragment fragment = new SecondFragment();
       FragmentTransaction transaction = manager.beginTransaction();
       transaction.replace(R.id.container, fragment).addToBackStack("tag");
       transaction.commit();
    }
    

    然后在你的FirstFragment当你想启动SecondFragment你可以启动为,

    ((YourActivity) getActivity()).startSecondFragment();
    

    【讨论】:

    • 非常有用的材料非常感谢@Heisen-Berg
    • 如果对您有帮助,请批准。
    猜你喜欢
    • 2014-12-10
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多