如何在 FrameLayout 中再次加载一个 Fragment?
How to load again a Fragment in FrameLayout?
假设我有类别 A 和 B。我根据类别在 RecyclerView
中加载数据。然后是过滤器,它实际上是过滤内容。
这是我在过滤器为 opened/closed:
时所做的
@Override
public void onShowSheet() {
Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.filterContent);
if (!(f instanceof FilterFragment)) {
FilterFragment filterFragment = FilterFragment.newInstance();
FragmentManager fm = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.filterContent, filterFragment, "FilterFragment");
fragmentTransaction.commit();
}
}
@Override
public void onHideSheet() {
Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.filterContent);
getActivity().getSupportFragmentManager().beginTransaction().
remove(getActivity().getSupportFragmentManager().findFragmentById(R.id.filterContent)).commit();
FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove(f);
trans.commit();
}
});
重新打开过滤器时,它会重新加载过滤器片段及其数据。
当我更改类别并打开过滤器时,它显示空白。
如何加载或终止片段,使其不显示空白?
更新
更改类别后,过滤器为空,我按返回键返回预览类别,并显示过滤器,但如果我尝试应用过滤器,应用程序会崩溃。
当我更改类别时,我重新加载包含数据的片段:
public static void inflateGridFragment() {
GridFragment fragment = new GridFragment();
FragmentManager fm = context.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right,
R.anim.slide_out_left, R.anim.slide_out_left);
fragmentTransaction.add(R.id.mdContent, fragment, Strings.TAG_GRID_FRAMGMENT);
fragmentTransaction.addToBackStack(Strings.TAG_GRID_FRAMGMENT);
fragmentTransaction.commit();
}
问题是,当从类别 A 更改为类别 B 时,我正在重新加载承载过滤器片段的父片段。因此,当更改类别时,我检查包含 RecyclerView
的片段是否在 backstack 中,然后我执行 popBackStackto that fragment, and update the data from
RecyclerView` 如下:
boolean foundGridFragment = false;
String fragmentBackstackTag = "";
FragmentManager fm = context.getSupportFragmentManager();
for(int entry = 0; entry < fm.getBackStackEntryCount(); entry++){
fragmentBackstackTag = fm.getBackStackEntryAt(entry).getName();
Log.i(TAG, "Found fragment: " + fragmentBackstackTag);
// check if null, because sometimes fragmentBackstacktag may null
if (fragmentBackstackTag != null) {
if (fragmentBackstackTag.equals(Strings.TAG_GRID_FRAMGMENT)) {
foundGridFragment = true;
fm.popBackStack(Strings.TAG_GRID_FRAMGMENT, 0);
}
}
}
if (!foundGridFragment) {
inflateGridFragment();
}
这也优化了内存使用。
假设我有类别 A 和 B。我根据类别在 RecyclerView
中加载数据。然后是过滤器,它实际上是过滤内容。
这是我在过滤器为 opened/closed:
@Override
public void onShowSheet() {
Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.filterContent);
if (!(f instanceof FilterFragment)) {
FilterFragment filterFragment = FilterFragment.newInstance();
FragmentManager fm = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.filterContent, filterFragment, "FilterFragment");
fragmentTransaction.commit();
}
}
@Override
public void onHideSheet() {
Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.filterContent);
getActivity().getSupportFragmentManager().beginTransaction().
remove(getActivity().getSupportFragmentManager().findFragmentById(R.id.filterContent)).commit();
FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove(f);
trans.commit();
}
});
重新打开过滤器时,它会重新加载过滤器片段及其数据。
当我更改类别并打开过滤器时,它显示空白。
如何加载或终止片段,使其不显示空白?
更新
更改类别后,过滤器为空,我按返回键返回预览类别,并显示过滤器,但如果我尝试应用过滤器,应用程序会崩溃。
当我更改类别时,我重新加载包含数据的片段:
public static void inflateGridFragment() {
GridFragment fragment = new GridFragment();
FragmentManager fm = context.getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right,
R.anim.slide_out_left, R.anim.slide_out_left);
fragmentTransaction.add(R.id.mdContent, fragment, Strings.TAG_GRID_FRAMGMENT);
fragmentTransaction.addToBackStack(Strings.TAG_GRID_FRAMGMENT);
fragmentTransaction.commit();
}
问题是,当从类别 A 更改为类别 B 时,我正在重新加载承载过滤器片段的父片段。因此,当更改类别时,我检查包含 RecyclerView
的片段是否在 backstack 中,然后我执行 popBackStackto that fragment, and update the data from
RecyclerView` 如下:
boolean foundGridFragment = false;
String fragmentBackstackTag = "";
FragmentManager fm = context.getSupportFragmentManager();
for(int entry = 0; entry < fm.getBackStackEntryCount(); entry++){
fragmentBackstackTag = fm.getBackStackEntryAt(entry).getName();
Log.i(TAG, "Found fragment: " + fragmentBackstackTag);
// check if null, because sometimes fragmentBackstacktag may null
if (fragmentBackstackTag != null) {
if (fragmentBackstackTag.equals(Strings.TAG_GRID_FRAMGMENT)) {
foundGridFragment = true;
fm.popBackStack(Strings.TAG_GRID_FRAMGMENT, 0);
}
}
}
if (!foundGridFragment) {
inflateGridFragment();
}
这也优化了内存使用。