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(); 
    } 
} 
+0

方法停止工作或应用程序? – arcticwhite

+0

在你旋转屏幕的情况下,活动对象是否为空? – Dinash

+0

您是否正在设置活动的配置更改?在你的清单中? – Ricardo

出于某种原因,activity变量失去它的实例,当你更改配置。可能的解决方法是在您的活动中将其设置为。

首先,请您activity变量公共

public AppCompatActivity activity; 

内,您的活动添加以下内容:

public void onConfigurationChanged(Configuration newConfig){ 
    super.onConfigurationChanged(newConfig); 
    NavigationManager.activity = this; 
}