FragmentManager的方向改变行为
问题描述:
我编码回片段导航和我有这个方法吧:FragmentManager的方向改变行为
private void removeFragment(Fragment fragment) {
if (activity == null) return;
activity.getSupportFragmentManager().beginTransaction()
.remove(fragment)
.commit();
}
它的工作原理精当我启动应用程序,并做导航。但是,当我旋转设备 - 此方法停止工作。删除调用的方法,但片段仍保留在屏幕上。无法弄清楚原因。需要一些帮助)
方法包含它这个类 -
public final class NavigationManager implements Navigation {
private final Stack<NavigationFragment> fragments;
@Nullable
private AppCompatActivity activity;
////
public NavigationManager() {
this.fragments = new Stack<>();
}
//// NAVIGATION
@Override
public void setNavigationMechanism(AppCompatActivity activity) {
this.activity = activity;
if (fragments.size() <= 1 || activity == null) return;
fragments.get(fragments.size() - 1).onBecomeVisible();
}
@Override
public void navigateTo(NavigationFragment fragment, boolean isReplacing) {
if (isReplacing) {
removeFragment(fragments.pop());
addFragment(fragment);
}
else addFragment(fragment);
}
@Override
public void navigateBack() {
if (activity == null) return;
if (fragments.size() <= 1) {
activity.finish();
return;
}
removeFragment(fragments.pop());
fragments.get(fragments.size() - 1).onBecomeVisible();
}
@Override
public void onHardwareBackButtonClicked() {
if (activity == null) return;
if (fragments.size() <= 1) {
activity.finish();
return;
}
removeFragment(fragments.pop());
fragments.get(fragments.size() - 1).onBecomeVisible();
}
@Override
public void onAuthenticationRevoked() {
fragments.clear();
try { addFragment(new AuthenticationFragment()); }
catch (IllegalStateException e) { if (activity != null) activity.finish(); }
}
////
private void addFragment(NavigationFragment navigationFragment) {
if (activity == null) return;
activity.getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container_frame_layout, (Fragment) navigationFragment)
.commit();
fragments.add(navigationFragment);
navigationFragment.onBecomeVisible();
}
private void removeFragment(NavigationFragment navigationFragment) {
if (activity == null) return;
activity.getSupportFragmentManager().beginTransaction()
.remove((Fragment) navigationFragment)
.commit();
activity.findViewById(R.id.fragment_container_frame_layout).invalidate();
}
}
答
出于某种原因,activity
变量失去它的实例,当你更改配置。可能的解决方法是在您的活动中将其设置为。
首先,请您activity
变量公共
public AppCompatActivity activity;
内,您的活动添加以下内容:
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
NavigationManager.activity = this;
}
方法停止工作或应用程序? – arcticwhite
在你旋转屏幕的情况下,活动对象是否为空? – Dinash
您是否正在设置活动的配置更改?在你的清单中? – Ricardo