Как из фрагмента закрыть или удалить етот же фрагмент в активити? [закрыт]
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.
Вопросы с просьбами помочь с отладкой («почему этот код не работает?») должны включать желаемое поведение, конкретную проблему или ошибку и минимальный код для её воспроизведения прямо в вопросе. Вопросы без явного описания проблемы бесполезны для остальных посетителей. См. Как создать минимальный, самодостаточный и воспроизводимый пример.
Закрыт 6 лет назад .
Я пробовал так : ((MainActivity)getActivity().getSupportFragmentManager().beginTransaction().remove(this); Но так ошибка.
Можно ли из фрагмента закрывать активити?
Задумано, чтобы при закрытии фрагмента закрывалась сразу и активити. Есть 2 варианта:
1) непосредственно в методе onDestroy() фрагмента вызывать activity.finish()
2) Передавать информацию активити, чтобы она самостоятельно finish()
В первом варианте меньше кода, но смущает момент, не много ли полномочий я даю фрагменту? Какой вариант приемлим?
- Вопрос задан более двух лет назад
- 163 просмотра
5 комментариев
Простой 5 комментариев
Как закрыть фрагмент?
Как закрыть фрагмент
Есть главное активити в котором с помощью фрагментов показывается разный контент. Типа таба с очень.
Вырезать фрагмент из wav файла и сохранить этот фрагмент в новый файл.
Добрый день, подскажите плиз как можно вырезать фрагмент из wav и сохранить его в новый wav файл?
как сделать так,чтобы когда я нажимаю кнопку закрыть в правом верхнем углу выходило окно сообшение?(типа вы хотите закрыть программу/да или нет/)
как сделать так,чтобы когда я нажимаю кнопку закрыть в правом верхнем углу выходило окно.
Закрыть 2 форму при этом не закрыть весь проект
Нужна помощь. как сделать так что бы в 1 форме выходила 2 а после,2 форма закрывалась при нажатии.
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();
или если обычный, не v4, фрагмент, то
getActivity().getFragmentManager().beginTransaction().remove(this).commit();
в общем одно из двух
Регистрация: 25.08.2015
Сообщений: 56
окей, он закрывает, а если обратно вернуться. у меня этот фрагмент открывается из другого фрагмента
Добавлено через 24 секунды
окей, он закрывает, а если обратно вернуться. у меня этот фрагмент открывается из другого фрагмента
Фрагменты вместо Активити: обработчик кнопки “назад”- часть 1
Во введении я перечислил проблемы при реализации навигации по экранам, используя Фрагменты в качестве функциональных экранов приложения.
Теперь я опишу, как обычно решаю первую проблему: отсутствие обработчика возврата в классе Фрагмента на предыдущий Фрагмент/Активити.
onBackPressed в классе Активити
В классе Активити есть метод, который переопределяют, чтобы ловить событие нажатия системной кнопки “Назад”:
@Override
public void onBackPressed()
// Какие-то действия, как, например, вывод сообщения: "Нажмите 'Назад' второй раз для выхода из приложения" super.onBackPressed();
>
Но в классе Фрагмента этого удобного метода нет, потому что Фрагменты задумывались как частичные представления, а не как замена Активити — то есть экраны в приложении.
Принцип решения
- Вводим интерфейс OnBackButtonListener , в котором определяем единственный метод boolean onBackPressed().
- Каждый класс Фрагмента, в котором нужно обработать событие нажатия кнопки “Назад”, должен реализовывать этот интерфейс.
- В методе onBackPressed() главной MainActivity реализуем логику по вызову собственного обработчика Фрагмента.
Пример приложения
Для этой части я реализовал пример. Видео к нему:
Видео демонстрации примера
Там есть всего три экрана и реализованы переходы между ними. На третьем последнем экране пользователь запускает действие. По факту, там ничего не делается и просто реализована пауза, во время которой отображается индикатор прогресса.
Я представил случай, что по какой-то причине, когда это действие выполняется, то необходимо дождаться его выполнения и не дать пользователю возможность закрыть Фрагмент по кнопке назад. В реальном приложении лучше не блокировать пользователя таким способом, но тут это используется для примера.
Пишем код
Полный код примера можно посмотреть в моём гитхабе:
poetofcode/FragmentsWithBackAction
Android project for a tutorial post. Contribute to poetofcode/FragmentsWithBackAction development by creating an…
А тут я приведу только самые важные части, по теме поста.
1. Интерфейс OnBackButtonListener
package ru.poetofcode.fragmentswithbackaction;
public interface OnBackButtonListener
boolean onBackPressed();
>
Метод onBackPressed() определён тут с результирующим параметром boolean , а не void , чтобы иметь возможность отменить стандартный ход выполнения onBackPressed в Активити (в моей реализации я обычно отдаю true , когда хочу запретить выход из Фрагмента). Таким образом, если это нужно, можно запретить возврат назад по нажатию кнопки. Например, часто можно увидеть в приложениях такой приём, где это используется — при нажатии кнопки “Назад” приложение выводит сообщение: “Нажмите назад ещё раз для выхода из приложения”.
2. Код шаблона главной Активити
xml version="1.0" encoding="utf-8"?>
FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" />
Сама MainActivity служит лишь контейнером для вложенных полноэкранных Фрагментов. Тут необходимо присвоить родительскому элементу id , я обычно добавляю в название слово container
3. Реализуем интерфейс OnBackButtonListener
Так выглядит код третьего фрагмента (на видео — тот, что запускает длительную операцию):
public class ThirdFragment extends Fragment implements OnBackButtonListener
boolean running = false;
// .
@Override
public boolean onBackPressed() if (running) Toast.makeText(getActivity(), "The operation is still in progress", Toast.LENGTH_LONG).show();
return true;
>
return false;
>
>
Я опустил тут часть, где реализуется само действие по нажатию кнопки, но нам тут важно, что в момент выполнения устанавливается флаг running в true . Таким образом, мы можем проверить — разрешать ли покидать Фрагмент. В противном случае — мы выводим пользователю сообщение.
4. Реализация onBackPressed() в главной Активити
Это самый важный пункт. Тут мы пользуемся FragmentManager ‘ом, для того, чтоб определить какой Фрагмент в данный момент является активным/текущим:
@Override
public void onBackPressed() int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
// Находим текущий Фрагмент и вызваем его метод: onBackPressed()
if (backStackCount > 0) Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
if (currentFragment instanceof OnBackButtonListener)
OnBackButtonListener backListener = (OnBackButtonListener) currentFragment;
boolean actionResult = backListener.onBackPressed();
if (actionResult) return;
>
>
>
super.onBackPressed();
>
Тут нужно обратить внимание на две вещи:
- Текущий Фрагмент можно найти по идентификатору контейнера в шаблоне главной Активити. В данном случае по: R.id.fragment_container
- Проверяю, реализует ли класс интерфейс слушателя OnBackButtonListener и, если да, то вызываю непосредственно обработчик onBackPressed
В следующей части я займусь заголовком окна: рассмотрю как реализовать смену названия заголовка при переходе между Фрагментами, а также отображения стрелки “⬅” в верхнем AppBar ‘е приложения.
