2017-06-06 48 views
0

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

@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()

以前的碎片没有被破坏吗?但事实并非如此,因为即使我打开应用程序并立即按下,它也不会退出应用程序。

我在这里做什么错了?

回答

0

您正在使用分段,所以要完成您的应用程序,您需要完成父级活动。因为你使用beginTransaction().add()添加的片段,包括startupFragment和在它上面的其他碎片可能

getActivity().finish(); 
0

试试这个从startupfragment完成的活动。然后,您将始终能够使用getFragmentManager().findFragmentByTag()找到它,因为所有添加的碎片都将位于碎片堆栈中(而find方法实际上是在堆栈中查找带有该标签的碎片)。

提示根据您想要什么IMPL:

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

它看起来像所有你需要做的是每个片段从后面堆在onBackPressed()添加到每个FragmentTransaction返回堆叠,然后在弹出的每个片段。

首先,修改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(); 
    } 
}