【问题标题】:Find a proper way to remove search onbackpress fragment找到删除搜索 onbackpress 片段的正确方法
【发布时间】:2017-03-11 23:38:31
【问题描述】:

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

  • 项目列表片段
  • 物品详情片段
  • 搜索/加载片段

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

这是从主要活动中替换片段的功能

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();
    }
}

【问题讨论】:

  • 取而代之的是,将所有片段保留在堆栈中并使用 add() 而不是片段事务的 replace() 方法来添加片段。它将让您完全控制导航生命周期。

标签: android fragment loading fragment-backstack


【解决方案1】:

经过数小时的解决。我遇到了一个简单的解决方案,基本上每次加载新片段时,我都会检查当前片段是否是搜索片段,如果是这样,我将使用 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();

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2015-07-18
    • 2017-07-24
    相关资源
    最近更新 更多