2017-08-10 62 views
0

我編碼回片段導航和我有這個方法吧: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

回答

0

出於某種原因,activity變量失去它的實例,當你更改配置。可能的解決方法是在您的活動中將其設置爲。

首先,請您activity變量公共

public AppCompatActivity activity; 

內,您的活動添加以下內容:

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