从片段关闭android应用程序

时间:2017-06-06 20:38:30

标签: android android-fragments onbackpressed

我的应用程序中只有一个活动有多个片段。每当用户打开应用程序时,它都会以startupFragment开头。每当用户浏览片段并按下时,都会将他带回startupFragment。但是当在startupFragment中时,我希望用户在点击后能够关闭应用程序。现在,这是代码,当应用程序启动以创建片段时。:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //Set starting fragment
    StartupFragment startupFragment = new StartupFragment();
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().add(R.id.content_main, startupFragment, "startupFragmentTag").commit();

}

如您所见,我添加了标记"startupFragmentTag"以便能够识别它。这是我的代码onBackPressed:

@Override
public void onBackPressed()
{

    Fragment startup = getFragmentManager().findFragmentByTag("startupFragmentTag");

    if(startup == null) {

        android.support.v4.app.FragmentManager manager = getSupportFragmentManager();
        StartupFragment startupFragment = new StartupFragment();
        manager.beginTransaction().replace(R.id.content_main, startupFragment, "startupFragmentTag").commit();

    } else {

        finish();

    }
}

所以基本上我在这里尝试的是,当用户在另一个片段中时,当用户按下时,它将把他/她带回startupFragment。但是当进入该片段时,再次按下时,我希望用户能够退出应用程序,这在现在的代码中不会发生。

我通过其标记找到startupFragment并检查它是否存在。如果没有,它将收回用户。但如果它存在,用户应该能够退出,这就是调用finish()的原因。

先前的碎片是否未被破坏?但情况并非如此,因为即使我打开应用程序并立即按回,它也不会退出应用程序。

我在这做错了什么?

3 个答案:

答案 0 :(得分:1)

您正在处理片段,因此要完成您的应用,您需要完成父级活动。

尝试此操作以完成startupfragment中的活动:

getActivity().finish();

答案 1 :(得分:1)

看起来您需要做的就是将每个Fragment添加到每个FragmentTransaction的后堆栈中,然后在onBackPressed()中从后堆栈中弹出每个Fragment。

首先,修改onCreate(),以便在每次交易时调用addToBackStack()

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      //Set starting fragment
      StartupFragment startupFragment = new StartupFragment();
      android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
      fragmentManager.beginTransaction()
        .add(R.id.content_main, startupFragment, "startupFragmentTag")
        .addToBackStack(null)
        .commit();
  }

然后,在onBackPressed()中,如果你不在起始片段上,只需从后面的堆栈中弹出。如果你在启动片段上,然后按下后退,只需拨打super.onBackPressed(),即可退出该应用:

@Override
public void onBackPressed() {
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    if (fragmentManager.getBackStackEntryCount() > 1) {
        //Go back to previous Fragment
        fragmentManager.popBackStackImmediate();
    } else {
        //Nothing in the back stack, so exit
        super.onBackPressed();
    }
}

答案 2 :(得分:0)

可能是因为您已使用beginTransaction().add()在其上添加包含startupFragment和其他片段的片段。然后你总是能够使用getFragmentManager().findFragmentByTag()找到它,因为添加的所有片段都在Fragment堆栈中(而find方法实际上是在堆栈中找到带有标记的Fragment)。

根据您想要的内容提示:

  1. beginTransaction().replace()将取代而不是添加片段,这样您就只能找到"一个现有的片段,如果你总是替换它。即在堆栈中始终是一个片段。
  2. 您可能希望使用getFragmentManager().findFragmentById()获取当前显示片段(位于片段堆栈顶部),而不是findFragmentByTag,如果堆栈中有多个片段未添加如上所述替换。
  3. 使用beginTransaction().add()时,您可能希望使用fragmentManager.addOnBackStackChangedListener()来监视Fragment堆栈更改。然后你可能不必处理onBackPressed()。然后在监听器中你只需要在顶层堆栈上检索当前的Fragment并查看它是什么并在那里添加你的逻辑。