Android Fragments 从片段关闭Android应用程序

jutyujz0  于 12个月前  发布在  Android
关注(0)|答案(3)|浏览(151)

我只有一个活动在我的应用程序中有多个片段.每当用户打开应用程序,它以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"来识别它。这是我在BackPressed上的代码:

@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()
以前的碎片不会被销毁吗?但不应该是这样,因为即使我打开应用程序并立即按下返回,它也不会退出应用程序。
我做错了什么?

92dk7w1h

92dk7w1h1#

看起来您需要做的就是将每个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()中,如果你不在起始Fragment上,只需从back堆栈弹出。如果你在起始Fragment上,并且back被按下,只需调用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();
    }
}

egmofgnx

egmofgnx2#

您正在使用片段,因此要完成应用,您需要完成父Activity。
尝试以下操作以完成startupfragment中的Activity:

getActivity().finish();

字符串

kokeuurv

kokeuurv3#

可能是因为你已经使用beginTransaction().add()添加了包括startupFragment和其他Fragment在内的Fragment,然后你将总是能够使用getFragmentManager().findFragmentByTag()找到它,因为所有添加的Fragment都将在Fragment堆栈中(而find方法实际上是在堆栈中找到带有标签的Fragment)。
根据您想要实现的内容提供提示:

  1. beginTransaction().replace()将替换而不是添加一个Fragment,这样,如果你总是替换它,你将只能“找到”一个现有的Fragment。
    1.如果堆栈中有几个Fragment被添加而不是如上所述被替换,您可能希望使用getFragmentManager().findFragmentById()来获取当前显示的Fragment(在Fragment堆栈的顶部),而不是findFragmentByTag
    1.当使用beginTransaction().add()时,你可能想使用fragmentManager.addOnBackStackChangedListener()来监视Fragment堆栈的变化。那么你可能就不必处理onBackPressed()了。然后在监听器中,你只需要在顶部堆栈上检索当前的Fragment,看看它是什么,然后在那里添加你的逻辑。

相关问题