【发布时间】: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