找到一种正确的方法来删除搜索onbackpress片段

时间:2017-03-11 23:38:31

标签: android fragment loading fragment-backstack

我正在开发一个涉及片段的应用程序。有三个片段

  • 项目列表片段
  • 项目详细信息片段
  • 搜索/加载片段

在用户按下onbackbutton之前,一切正常。我想在显示搜索片段之前向用户显示前一个片段。 我尝试了很少的解决方案,但似乎没有一个适合我。我试图从后面卡住手动删除搜索片段,但我得到了奇怪的情况,即前一个片段和当前片段同时显示。

这是替换主要活动

中的片段的功能
public void replaceFragment(Class<?> fragClass, Bundle b)
{
    Fragment bf = null;
    try
    {
        bf = (Fragment) fragClass.newInstance();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    if (b != null)
    {
        bf.setArguments(b);
    }

    Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
    String backStateName = bf.getClass().getSimpleName();
    if (f != null && backStateName.equals(f.getClass().getSimpleName()))
    {
        return;
    }

    FragmentManager manager = getSupportFragmentManager();
    _currentFragment = bf;
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.setCustomAnimations(R.anim.enter_from_left, R.anim.exit_to_right, R.anim.enter_from_left, R.anim.exit_to_right);

    if(backStateName.equals(LoadingFragment.class.getSimpleName()))
    {
        ft.replace(R.id.fragment_container, bf).addToBackStack(null).commit();
    }
    else
    {
        ft.replace(R.id.fragment_container, bf).addToBackStack(backStateName).commit();
    }
}

onbackpress功能

@Override
public void onBackPressed()
{
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START))
    {
        drawer.closeDrawer(GravityCompat.START);
    }
    else
    {
        super.onBackPressed();
    }
}

1 个答案:

答案 0 :(得分:0)

经过几个小时的解决。我遇到了一个简单的解决方案,基本上每当我加载一个新片段时,我都会检查当前片段是否是搜索片段,如果是,我将使用popBackStackImmediate()手动删除它。不是最优雅的解决方案,但它对我有用。

这是我的新功能。

public void replaceFragment(Class<?> fragClass, Bundle b)
{
    BaseFragment bf = null;
    try
    {
        bf = (BaseFragment) fragClass.newInstance();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    if (b != null)
    {
        bf.setArguments(b);
    }

    Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
    String backStateName = bf.getClass().getSimpleName();
    if (f != null && backStateName.equals(f.getClass().getSimpleName()))
    {
        return;
    }

    FragmentManager manager = getSupportFragmentManager();
    _currentFragment = bf;
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

    if (f != null && f.getClass().getSimpleName().equals(LoadingFragment.class.getSimpleName()))
    {
        manager.popBackStackImmediate();
    }

    ft.replace(R.id.fragment_container, bf, backStateName);
    ft.addToBackStack(backStateName);
    ft.commitAllowingStateLoss();

}