Я создаю приложение для 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» одним методом и просто передать в каждый тип класса параметр. Я все посмотрел и не могу найти ответ, который я ищу с этой конкретной ситуацией.
Благодарим за комментарий, я внедрил это решение и, похоже, работает хорошо. Я искал способ немного очистить код, он не чувствовал себя хорошо, делая все, что копирует и вставляет, и делает несколько функций, которые делают то же самое. – Joshua