Замененный фрагмент не уничтожен

РЕДАКТИРОВАТЬ:
После еще некоторого возни, я выяснил причину моей предыдущей проблемы (см. Ниже. TL;DR: я пытаюсь пройти Bundle от действия к его фрагменту путем замены фрагмента) заключается в том, что при замене фрагментов, таких как это:

    AddEditActivityFragment fragment = new AddEditActivityFragment();
    Bundle arguments = getIntent().getExtras();
    fragment.setArguments(arguments);
    getSupportFragmentManager().beginTransaction()
        .replace(R.id.add_edit_fragment, fragment)
        .commit();

замененный фрагмент не уничтожается (как должно быть в соответствии с кучей источников), что я проверял путем переопределения и добавления регистрации в onPause, onStop, onDestroyView, onDestroy и т.д. Ни один из них не называется.
призвание popBackStackImmediate тоже ничего не делает. Что я могу сделать?




Предыдущий заголовок вопроса: "Динамическая установка значка FloatingActionButton с помощью setImageDrawable не имеет никакого эффекта".
у меня есть FAB внутри фрагмента (называемого AddEditFragment), который служит для сохранения пользовательского ввода в базу данных.
Чтобы различать редактирование строк из БД и создание новых, мне нужно было установить его значок либо "отправить", либо "сохранить". По умолчанию кнопка настроена на "отправить":

    <android.support.design.widget.FloatingActionButton
    android:id="@+id/add_edit_fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/fab_margin"
    app:layout_anchor="@id/add_edit_toolbar"
    app:layout_anchorGravity="bottom|right|end"
    app:srcCompat="@drawable/ic_send_white_24dp"/>

Я использовал, чтобы установить иконку для "сохранения", внедрив интерфейс в моем фрагменте, который служит для передачи данных из содержащего действия во фрагмент, используя этот метод:

    @Override
public void receiveData(Serializable data) {
    Log.d(TAG, "receiveData: called");
    mFoodItem = (FoodItem) data;
    if (mFoodItem != null) {
        mEditMode = true;
        fab.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_save_white_24dp));
        utilDisplayFoodItem();
    }
}

Вызов setImageDrawable работал нормально и изменил значок с "отправить" на "сохранить" должным образом.


Вот когда я сталкиваюсь с неприятностями.
Я пытаюсь удалить зависимость моего класса AddEditFragment от моего класса AddEditActivity, удаляя указанную реализацию интерфейса и передавая данные, требуемые фрагментом, через Bundle:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    Log.d(TAG, "onCreate: starts");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_edit);

    AddEditActivityFragment fragment = new AddEditActivityFragment();
    Bundle arguments = getIntent().getExtras();
    boolean editMode = arguments != null;
    fragment.setArguments(arguments);

    getSupportFragmentManager().beginTransaction()
            .replace(R.id.add_edit_fragment, fragment)
            .commit();

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp);
    getSupportActionBar().setTitle((editMode) ? "Edit Item:" : "Create Item:");
    getSupportActionBar().setElevation(0);
    Log.d(TAG, "onCreate: ends");
}


В этом контексте я удалил receiveData метод из фрагмента, и поместил эту строку:

fab.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_save_white_24dp));

в различных вероятных местах в моем классе фрагмента (наиболее вероятно, внутри onCreateView метод).
Кажется, это не имеет никакого эффекта. Мои случаи:

  1. Просто добавив сказал setImageDrawable call - устанавливает значок "сохранить" в обоих режимах добавления / редактирования, но тогда у меня нет значка "отправить".
  2. Устанавливаем любой случай динамически ( setImageDrawable звонок внутри if блок) - значок установлен на "отправить" в обоих режимах добавления / редактирования.
  3. Удаление значка "отправить" по умолчанию из XML, затем динамическая установка любого из них - для значка установлено "отправить" в обоих режимах добавления / редактирования.
  4. Удаление значка по умолчанию из XML, затем установка только динамического "сохранения" (нет if блок) - устанавливает значок "сохранить" в обоих режимах добавления / редактирования, но тогда у меня нет значка "отправить".

Кажется setImageDrawable звонок, который отлично работал в моем receiveData метод интерфейса, не имеет никакого эффекта (по крайней мере, когда значок уже установлен, или когда внутри if блок).

Я в растерянности и буду признателен за любую помощь!


В ответ на @ColdFire:

        @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    Log.d(TAG, "onCreateView: starts");
    View view = inflater.inflate(R.layout.fragment_add_edit, container, false);
    ButterKnife.bind(this, view);

    Bundle arguments = getArguments();
    if (arguments != null) {
        mFoodItem = (FoodItem) arguments.getSerializable(FoodItem.class.getSimpleName());
        if (mFoodItem != null) {
            mEditMode = true;
            // Tried calling setImageDrawable here
        }
    }

    // Tried calling setImageDrawable here

    if (!mEditMode) {
        // If adding an item, initialize it for right now's date and time
        Calendar now = Calendar.getInstance();
        mFoodItem.setDate(now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH));
        mFoodItem.setTime(now.getTimeInMillis() / Constants.MILLISECONDS);
    }
    utilDisplayFoodItem();
    utilSetOnClickListeners();
    setHasOptionsMenu(true);

    // Tried calling setImageDrawable here

    Log.d(TAG, "onCreateView: ends");
    return view;
}

Я должен отметить, что все остальное, что зависит от данных Bundle, работает правильно.

1 ответ

Возможно, вы захотите очистить обратно стек, используя следующий метод

private void clearBackStack() {
    FragmentManager manager = getSupportFragmentManager();
    if(manager.getBackStackEntryCount() > 0) {
        FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
        manager.popBackStackImmediate(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
}

Вы можете проверить этот пост, спасибо

Это уничтожит только текущий фрагмент, подлежащий замене. Если вы хотите уничтожить все, что вы можете прочитать этот вопрос стека

Другие вопросы по тегам