Как заменить фрагмент нажатием кнопки этого фрагмента?

У меня есть активность, содержащая множественные фрагменты. Вначале активность фрагментации и в ней есть две кнопки. После нажатия этой кнопки я должен заменить фрагмент на новый фрагмент. Каждый фрагмент имеет различные виджеты и заменяет текущий фрагмент как различные события.

Это моя проблема. Как я могу достичь этого.

Предложите мне идеи.

Ответ 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;
}