2014-03-03 12 views
0

我構建了一個應用程序,該應用程序由Activity和Fragments組成,它們位於Activity中。 我根據應用程序流來替換碎片,但似乎隨着更多操作添加到應用程序中,跟蹤代碼中的應用程序流變得更加困難。如何將結構添加到構建在碎片上的UI上?

假設這樣的:

public class MainActivity extends Activity{ 
     private enum AppState { 
      WAIT_SIGN_IN, SCAN_PERSONAL_ID, CONFIRM_ORDER, PICK_ITEM, NAVIGATE_TO_ITEM 
     } 

     private AppState currentState = AppState.WAIT_SIGN_IN; 


     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      setWaitSignInContent(); 
     } 

     //Hardware key is pressed 
     @Override 
     public boolean onKeyDown(int keyCode, KeyEvent event) { 

      switch (currentState) { 
      case WAIT_SIGN_IN: 
       setSignInContent(); 
       currentState = AppState.SCAN_PERSONAL_ID; 
       break; 
      case PICK_ITEM: 
       handlePickItem(); 
      default: 
       break; 
      } 

      return true; 
     } 

     //Callback from barcode scanner 
     @Override 
     public void onCodeScanned(String code) { 
      switch (currentState) { 
      case SCAN_PERSONAL_ID: 
       if (checkPersonalId(code)) { 
        setSignInSuccessContent(); 
       } 
       break; 
      default: 
       break; 
      } 
     } 

     private void setSignInSuccessContent() { 
      Fragment fragment = new ImageFragment(); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      ft.replace(R.id.content_primary, fragment).commit(); 
     } 


     private void setSignInContent() { 
      Fragment fragment = new ScannerFragment(); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      ft.replace(R.id.content_primary, fragment).commit(); 
     } 

     private void setWaitSignInContent() { 
      Fragment fragment = new ImageFragment(); 
      FragmentTransaction ft = getFragmentManager().beginTransaction(); 
      ft.replace(R.id.content_primary, fragment).commit(); 
     } 

    } 

} 

正如你所看到的,這種基於狀態的流量是很難效仿。有關如何改善這一點的任何建議?

回答

0

我是按照這個方式來代替片段

在您的活動創建方法添加和更換。

public void addFragments(Fragment fragment, boolean animate, 
     boolean addToBackStack, String tag) { 

    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction ft = manager.beginTransaction(); 
    if (animate) { 
     // ft.setCustomAnimations(R.anim.fragment_from_right, 
     // R.anim.fragment_from_left, R.anim.fragment_from_right, 
     // R.anim.fragment_from_left); 
    } 
    if (addToBackStack) { 
     ft.addToBackStack(tag); 
    } 
    ft.replace(R.id.content_frame, fragment); 
    ft.commit(); 
} 

// remove all fragments from the stack 
public void removeAllFragment(Fragment replaceFragment, boolean animate, 
     boolean addToBackStack, String tag) { 
    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction ft = manager.beginTransaction(); 
    manager.popBackStackImmediate(null, 
      FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    if (animate) { 
     // ft.setCustomAnimations(R.anim.slide_in_right, 
     // R.anim.slide_out_left); 
     // ft.setCustomAnimations(R.anim.fragment_from_right, 
     // R.anim.fragment_from_left, R.anim.fragment_from_right, 
     // R.anim.fragment_from_left); 
    } 
    if (addToBackStack) { 
     ft.addToBackStack(tag); 
    } 
    ft.replace(R.id.content_frame, replaceFragment); 
    ft.commit(); 
} 

現在覆蓋片段

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    if (activity instanceof MainActivity) { 
     mainActivity = (MainActivity) activity; 

    } 
} 

現在只是在片段呼籲取代像

mainActivity.addFragments(new BusinessDetail(), true, tr, null); 

享受我希望它能幫助。

+0

問題是:在我的Activity中有多個地方的活動狀態發生了變化。它具有透明的應用程序流。 –

+0

然後提到應用程序流程 –

0

由於您的應用中似乎只有一項活動,因此您可以考慮使用單例模式(顯然,活動本身就是單例模式)。例如,你的界面可能是這樣的:

public void addFragment(Fragment fragment, boolean replaceTopFragmentInStack); 
public void removeFragment(Fragment fragment); 
public void removeFragment(int index); 
public void removeTopFragment(); 
public void clearFragmentStack(); 

您不僅能夠輕鬆地控制流量,但你也將通過類似MainActivity.getInstance訪問這些方法在應用程序從任何地方( ).removeTopFragment()

相關問題