2015-06-19 2 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

Смежные вопросы