У меня есть ProjectDetailFragment, который показывает простой TextView с именем проекта. Также у меня есть ProjectsListFragment, который использует ProjectsListAdapter для отображения списка проектов. Когда я щелкаю по проекту в списке, вызывается метод replaceDetailFragment (длинный идентификатор). У меня есть две реализации этого метода:
private void replaceDetailFragment(long id) {
FragmentManager fragmentManager = getSupportFragmentManager();
ProjectDetailFragment detailFragment = (ProjectDetailFragment) fragmentManager.findFragmentByTag(ProjectDetailFragment.TAG);
if (detailFragment == null) {
detailFragment = new ProjectDetailFragment();
}
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
detailFragment.setProject((int) id);
transaction.replace(R.id.project_detail_fragment_container, detailFragment, ProjectDetailFragment.TAG);
transaction.addToBackStack(ProjectDetailFragment.TAG);
transaction.commit();
}
и
private void replaceDetailFragment(long id) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
ProjectDetailFragment detailFragment = (ProjectDetailFragment) fragmentManager.findFragmentByTag(ProjectDetailFragment.TAG);
if (detailFragment != null)
transaction.remove(detailFragment);
detailFragment = new ProjectDetailFragment();
detailFragment.setProject((int) id);
transaction.replace(R.id.project_detail_fragment_container, detailFragment, ProjectDetailFragment.TAG);
transaction.addToBackStack(ProjectDetailFragment.TAG);
transaction.commit();
}
detailFragment.setProject ((int) id) является установщиком переменной projectId ProjectDetailFragment, который использует в ProjectDetailFragment. onStart для установки содержимого TextView, в котором отображается имя проекта.
Обе реализации имеют проблемы:
Первая реализация заменяет фрагмент на себя, аProjectDetailFragment.onStart не вызывается (также onCreate и любые другие методы жизненного цикла), это означает отсутствие изменений для содержимого TextView
Во второй реализации этой проблемы нет, но она создает нескольконевидимые фрагменты, и когда я поворачиваю экран, метод onCreate вызывает для каждого фрагмента, и я не могу правильно восстановить значение projectId
public class ProjectDetailFragment extends Fragment {
public static final String TAG = "projectDetailFragment";
private long projectId;
public void setProject(int id) {
this.projectId = id;
}
public ProjectDetailFragment() {
// Required empty public constructor
}
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("projectId", this.projectId);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
this.projectId = savedInstanceState.getLong("projectId");
}
}
@Override
public void onStart() {
super.onStart();
View view = getView();
if (view != null) {
Project project = Project.getProjects().get((int)projectId);
TextView nameView = (TextView) getView().findViewById(R.id.tvName);
nameView.setText(project.getName());
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_project_detail, container, false);
}
}
(я знаю, что могу изменитьсодержимое TextView без замены фрагментов, я также знаю, что могу создать отдельный метод, который будет изменять содержимоетекстовое представление, когда я хочу, но я просто хочу понять, как работают транзакции и почему удаление + добавление не удаляет фрагменты полностью)