Замененный фрагмент не уничтожен
РЕДАКТИРОВАТЬ:
После еще некоторого возни, я выяснил причину моей предыдущей проблемы (см. Ниже. 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
метод).
Кажется, это не имеет никакого эффекта. Мои случаи:
- Просто добавив сказал
setImageDrawable
call - устанавливает значок "сохранить" в обоих режимах добавления / редактирования, но тогда у меня нет значка "отправить". - Устанавливаем любой случай динамически (
setImageDrawable
звонок внутриif
блок) - значок установлен на "отправить" в обоих режимах добавления / редактирования. - Удаление значка "отправить" по умолчанию из XML, затем динамическая установка любого из них - для значка установлено "отправить" в обоих режимах добавления / редактирования.
- Удаление значка по умолчанию из 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);
}
}
Вы можете проверить этот пост, спасибо
Это уничтожит только текущий фрагмент, подлежащий замене. Если вы хотите уничтожить все, что вы можете прочитать этот вопрос стека