Android - 单个片段暂停和恢复但不破坏
Android - Single fragment pause and resume but no destroying
我正在构建一个完全由片段和单个 activity 组成的应用程序。我有这个用例,其中每个片段都应该初始化一次,每次被替换时它都会得到 resume/paused
。我认为只有一个片段实例就可以完成工作,但它没有按预期发生。
我想知道如何实现这一点,以便每次只有一个片段实例获得 resume/pause
。
用这个方法切换Fragment
s
void switchFragment(@NonNull Fragment fragment, boolean addToBackStack) {
final String NAME = fragment.getClass().getName();
final FragmentManager fm = getSupportFragmentManager();
final boolean fragmentPopped = fm.popBackStackImmediate(NAME, 0);
if (fragmentPopped || fm.findFragmentByTag(NAME) != null) {
return;
}
if (addToBackStack) {
fm.beginTransaction()
.replace(mContainerResId, fragment, NAME)
.commit();
} else {
fm.beginTransaction()
.replace(mContainerResId, fragment, NAME)
.addToBackStack(NAME)
.commit();
}
}
然后在 Fragment
class 中创建如下视图
private View rootView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (rootView == null) {
rootView = inflater.inflate(R.layout.your_layout, container, false);
}
return rootView;
}
我正在构建一个完全由片段和单个 activity 组成的应用程序。我有这个用例,其中每个片段都应该初始化一次,每次被替换时它都会得到 resume/paused
。我认为只有一个片段实例就可以完成工作,但它没有按预期发生。
我想知道如何实现这一点,以便每次只有一个片段实例获得 resume/pause
。
用这个方法切换Fragment
s
void switchFragment(@NonNull Fragment fragment, boolean addToBackStack) {
final String NAME = fragment.getClass().getName();
final FragmentManager fm = getSupportFragmentManager();
final boolean fragmentPopped = fm.popBackStackImmediate(NAME, 0);
if (fragmentPopped || fm.findFragmentByTag(NAME) != null) {
return;
}
if (addToBackStack) {
fm.beginTransaction()
.replace(mContainerResId, fragment, NAME)
.commit();
} else {
fm.beginTransaction()
.replace(mContainerResId, fragment, NAME)
.addToBackStack(NAME)
.commit();
}
}
然后在 Fragment
class 中创建如下视图
private View rootView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (rootView == null) {
rootView = inflater.inflate(R.layout.your_layout, container, false);
}
return rootView;
}