Почему не удаляет фрагменты полностью транзакции. - PullRequest
0 голосов
/ 25 октября 2019

У меня есть 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, в котором отображается имя проекта.

Обе реализации имеют проблемы:

  1. Первая реализация заменяет фрагмент на себя, аProjectDetailFragment.onStart не вызывается (также onCreate и любые другие методы жизненного цикла), это означает отсутствие изменений для содержимого TextView

  2. Во второй реализации этой проблемы нет, но она создает нескольконевидимые фрагменты, и когда я поворачиваю экран, метод 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 без замены фрагментов, я также знаю, что могу создать отдельный метод, который будет изменять содержимоетекстовое представление, когда я хочу, но я просто хочу понять, как работают транзакции и почему удаление + добавление не удаляет фрагменты полностью)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...