2015-06-19 101 views
0

我正在創建一個使用主活動和多個片段的Android應用。主要活動是對所有內容的最小「控制」,並且每個片段顯示具有不同信息的不同屏幕。下面是一些代碼爲我的主要活動:Android - 在活動中更改片段

public class MainMenu extends FragmentActivity implements FirstMenu.FragmentListener, Checklist.FragmentListener, 
    Tool.FragmentListener{ 

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

    FirstMenu firstMenu = new FirstMenu(); 

    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, 
      firstMenu).commit(); 
} 

public void changeScreen() { 

    Checklist checklist = new Checklist(); 

    android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

    transaction.replace(R.id.fragment_container, checklist); 
    transaction.addToBackStack(null); 
    transaction.commit(); 

} 

public void changeScreenTwo() { 

    ChemicalCheckList chemChecklist = new ChemicalCheckList(); 

    android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

    transaction.replace(R.id.fragment_container, chemChecklist); 
    transaction.addToBackStack(null); 
    transaction.commit(); 

} 

在此可以顯示菜單爲我的第一個片段代碼:

public class FirstMenu extends Fragment { 
    FragmentListener fragmentChanger; 

    public interface FragmentListener { 
     public void changeScreen(); 
     public void changeScreenFour(); 
     public void changeScreenFive(); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      fragmentChanger = (FragmentListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(); 
     } 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     container.removeAllViews(); 
     View view = inflater.inflate(R.layout.menu, container, false); 

     Button checkListButton = (Button) view.findViewById(R.id.checklistButton); 
     Button toolButton = (Button) view.findViewById(R.id.toolButton); 
     Button timeFuseButton = (Button) view.findViewById(R.id.timeFuseCalculator); 
     Button blastFragButton = (Button) view.findViewById(R.id.blastFragButton); 
     Button demoButton = (Button) view.findViewById(R.id.demoButton); 



     checkListButton.setOnClickListener(
       new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         buttonClicked(v); 
        } 
       } 
     ); 

     toolButton.setOnClickListener(
       new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         toolButtonClicked(v); 
        } 
       } 
     ); 

     demoButton.setOnClickListener(
       new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         demoButtonClicked(v); 
        } 
       } 
     ); 




     blastFragButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(getActivity(), BlastFrag.class); 
       startActivity(intent); 
      } 
     }); 
     timeFuseButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(getActivity(), TimeFuse.class); 
       startActivity(intent); 
      } 
     }); 

     return view; 

    } 

    public void buttonClicked(View v) { 
     fragmentChanger.changeScreen(); 
    } 
    public void toolButtonClicked(View v) { 
     fragmentChanger.changeScreenFour(); 
    } 
    public void demoButtonClicked(View v) { 
     fragmentChanger.changeScreenFive(); 
    } 
} 

這是第二個片段,該代碼通過使用changeScreen()方法顯示在屏幕上。

public class Checklist extends Fragment{ 
    FragmentListener fragmentAlternator; 

    public interface FragmentListener { 
     public void changeScreenTwo(); 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      fragmentAlternator = (FragmentListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(); 
     } 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     container.removeAllViews(); 
     View view = inflater.inflate(R.layout.checklists, container, false); 

     Button chemButton = (Button) view.findViewById(R.id.chemButton); 


     chemButton.setOnClickListener(
       new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         buttonClicked(v); 
        } 
       } 
     ); 

     return view; 
    } 
    public void buttonClicked(View v) { 
     fragmentAlternator.changeScreenTwo(); 
    } 
} 

我有顯示使用多種方法,諸如在屏幕更多的片段:changeScreenTwo(),changeScreenThree(),changeScreenFour(),等。用於這些方法的代碼是所有幾乎完全相同。唯一的區別是它從不同的類創建不同的對象。我想知道目前我正在做的這種方式是否可行,或者如果有一種方法,我可以將所有這些「changeScreen」方法合併爲一個方法,並簡單地將每種類型的參數作爲參數傳遞。我已經找遍了,似乎無法找到我正在尋找這種特殊情況下的答案。

回答

0

傳入片段索引並使用它選擇片段類型。

public void changeScreen(int position) { 
    switch(position){ 
     case 0: 
      getSupportFragmentManager().beginTransaction() 
       .replace(R.id.fragment_container, new Checklist()) 
       .addToBackStack(null) 
       .commit(); 
      break; 
     case 1: 
      getSupportFragmentManager().beginTransaction() 
       .replace(R.id.fragment_container, new ChemicalCheckList()) 
       .addToBackStack(null) 
       .commit(); 
      break; 
    } 
} 
+0

感謝您的評論,我實施了這個解決方案,它似乎運作良好。我一直在尋找一種清理代碼的方法,它不會做所有的複製和粘貼,並且使得多個功能完成相同的功能。 – Joshua