我正在制作一个汽车查找应用程序。我在gridview中显示结果,并在右侧有一个滑动菜单(用于搜索过滤器)。我已经在片段的帮助下制作了这个整个应用程序。在gridview中我在底部有一个负载更多的页脚,当我点击第12个位置gridview时,我正在启动另一个这样的片段:
SearchDetailActivity.goToFragment(ProductDetailFragment.newInstance(map,position));
并且在ProductDetailFragment中我有一个后退按钮,可以像这样返回上一个片段:
SearchDetailActivity.goToFragment(SearchDetailFragment.newInstance(str_url));
现在,当我再次回来时,数据显示为0-10项。
在goToFragment()中我写了这段代码:
public static void goToFragment(Fragment fragment) {
Log.d("GoToFrag","sjdk>>"+fragment);
Fragment tmp = fm.findFragmentByTag(fragment.getClass().getName());
if (tmp != null && tmp.isVisible())
return;
ft = fm.beginTransaction();
ft.replace(R.id.main_fragment, fragment, fragment.getClass().getName());
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
currentTag = fragment.getClass().getName();
}
我想避免从ProductDetailFragment回来时重新加载数据。如果我使用了Activity,那么我可以使用onBackPressed()来回复并避免重新加载但是当我按下应用程序的后退按钮时它会在Fragment中重新加载SearchDetatilFragment,这很烦人。请帮帮我..谢谢。
答案 0 :(得分:27)
我在这个问题上偶然发现了大约3个月。最后,我付出了努力并找到了解决方案。
问题是,当您使用“替换”时,这相当于“删除并添加”。 因此,当按下后退按钮时,片段将被完全删除并重新创建。 相反,我们必须隐藏父片段并显示孩子。
称为serach片段
ft = fm.beginTransaction();
ft.replace(R.id.main_fragment, yourSearchFragment, "searchFragment");
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
调用productDetails片段
时 ft = fm.beginTransaction();
ft.hide(getFragmentManager().findFragmentByTag("searchFragment"));
ft.add(R.id.main_fragment, yourDetailfragment);
ft.addToBackStack(null);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
祝你好运
答案 1 :(得分:-2)
在片段的反压下使用getFragmentManager()。popBackStack(),这将加载前一个片段而不是创建新片段。
对于你的应用程序后退按钮,设置一个这样的监听器:
View.OnClickListener mBackListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
getFragmentManager().popBackStack();
}
};