Как заменить фрагмент нажатием кнопки этого фрагмента?
У меня есть активность, содержащая множественные фрагменты. Вначале активность фрагментации и в ней есть две кнопки. После нажатия этой кнопки я должен заменить фрагмент на новый фрагмент. Каждый фрагмент имеет различные виджеты и заменяет текущий фрагмент как различные события.
Это моя проблема. Как я могу достичь этого.
Предложите мне идеи.
Ответы
Ответ 1
вы можете заменить фрагмент на FragmentTransaction.
Здесь вы идете.
Сделайте интерфейс.
public interface FragmentChangeListener
{
public void replaceFragment(Fragment fragment);
}
реализует активность вашего фрагментации с помощью этого интерфейса.
public class HomeScreen extends FragmentActivity implements
FragmentChangeListener {
@Override
public void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();;
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(mContainerId, fragment, fragment.toString());
fragmentTransaction.addToBackStack(fragment.toString());
fragmentTransaction.commit();
}
}
Вызовите этот метод из таких фрагментов.
//В вашем фрагменте.
public void showOtherFragment()
{
Fragment fr=new NewDisplayingFragment();
FragmentChangeListener fc=(FragmentChangeListener)getActivity();
fc.replaceFragment(fr);
}
Надеюсь, что это сработает!
ПРИМЕЧАНИЕ. mContainerId - это идентификатор представления, который удерживает фрагменты внутри.
Вы также должны переопределить метод Fragment onString().
Ответ 2
Ну, даже я учусь Android...
Недавно я решил ту же проблему: "Как изменить фрагмент при событии нажатия кнопки".
buttonName.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentTransaction fragmentTransaction = getActivity()
.getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame1, new Homefragment());
fragmentTransaction.commit();
}
});
Здесь frame1
- это идентификатор FrameLayout
, который определен в моем DrawerLayer XML.
Так что теперь, когда я хочу фрагментную транзакцию, я использую этот код. Каждый раз он заменит frame1
вместо вашего последнего фрагмента.
FragmentTransaction fragmentTransaction = getActivity()
.getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame1, new newfragment());
fragmentTransaction.commit()
Надеюсь, это поможет..
Ответ 3
Чтобы заменить фрагмент при нажатии кнопки этого фрагмента, можно использовать следующее:
getFragmentManager().beginTransaction().replace(R.id.main_content, new insertFragmentNameHere()).addToBackStack(null).commit();
Ответ 4
- Определите интерфейс и назовите его IChangeListener (или что-то в этом роде) и определите метод, внутри которого будет выполняться работа (ex,
changeFragment()
) (или вызов другого метода, который будет выполнять работу) для изменения фрагмента).
- Сделайте свою деятельность реализацией интерфейса или создайте анонимный класс внутри этого мероприятия.
- Создайте параметризованный конструктор вашего фрагмента, который принимает параметр IChangeListener.
- При инициализации фрагмента передайте свою реализацию IChangeListener (анонимный класс или активность, реализуя его).
- Сделать прослушивателем onClick кнопкой вызов метода изменения IChangeListener.
Ответ 5
С будущего 2017 года и после этого существуют разные библиотеки, которые запускают события с использованием шины, и теперь вы можете использовать их для указания активности, когда событие является триггером во фрагменте, который принадлежит ему.
Обратитесь к:
RxBus с RxJava
Вы можете проверить новые архитектуры, предлагаемые Google
ViewModel
Не используйте подход в принятом ответе, получите действительно уродливое с более чем тремя различными событиями из фрагментов
Ответ 6
Вы можете попробовать этот код, он отлично работает со мной, надуть макет для просмотра, Определить кнопку и нажать,
Button btn_unstable;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home,container,false);
btn_unstable = (Button)view.findViewById(R.id.btn_unstable);
btn_unstable.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.fragment_replace, new UnstableFragment()).commit();
}
});
return view;
}