Как открыть новый фрагмент из другого фрагмента?
-
21-12-2019 - |
Вопрос
Я попробовал сделать навигацию между фрагментами.у меня есть NewFragment.java
с новым работающим фрагментом.Моя проблема:
Как мне это сделать onClickListener
бегать NewFragment.java
правильно?
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getActivity(), NewFragment.class);
startActivity(i);
}
});
К вашему сведению:Это изнутри фрагмента (не знаю, имеет ли это значение).
Решение
Добавьте следующий код в функцию прослушивания кликов:
NextFragment nextFrag= new NextFragment();
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.Layout_container, nextFrag, "findThisFragment")
.addToBackStack(null)
.commit();
Строка "findThisFragment"
при необходимости можно использовать для поиска фрагмента позже.
Другие советы
Это более описанный код кода @Narendra,
Сначала вам нужен экземпляр второго фрагмента.Тогда у вас должны быть объекты FragmentManager и FragmentTransaction.Полный код приведен ниже:
Fragment2 fragment2=new Fragment2();
FragmentManager fragmentManager=getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.content_main,fragment2,"tag");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Надеюсь, это сработает.Иногда вы можете получить getSupportFragmentManager() вместо getFragmentManager().
Вам следует создать функцию внутри действия, чтобы открыть новый фрагмент и передать ссылку на действие на фрагмент, а в каком-то событии внутри фрагмента вызвать эту функцию.
@Override
public void onListItemClick(ListView l, View v, int pos, long id) {
super.onListItemClick(l, v, pos, id);
UserResult nextFrag= new UserResult();
this.getFragmentManager().beginTransaction()
.replace(R.id.content_frame, nextFrag, null)
.addToBackStack(null)
.commit();
}
Использовать это,
AppCompatActivity activity = (AppCompatActivity) view.getContext();
Fragment myFragment = new MyFragment();
activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();
Fragment fr = new Fragment_class();
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.add(R.id.viewpagerId, fr);
fragmentTransaction.commit();
Чтобы быть точным, R.id.viewpagerId
создается в вашем текущем макете класса, при вызове новый фрагмент автоматически проникает.
Добавление к решению @Narendra...
ВАЖНЫЙ:При работе с фрагментами навигация тесно связана с активностью хоста, поэтому вы не можете просто переходить от фрагмента к фрагменту без реализации этого класса фрагмента в активности хоста.
Образец:
public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener {
Также убедитесь, что активность вашего хоста имеет следующую функцию переопределения:
@Override
public void onFragmentInteraction(Uri uri) {}
Надеюсь это поможет...
Ну, моя проблема заключалась в том, что я использовал код из ответа, который здесь проверен как решение, но после выполнения замены первый слой все еще был виден и функционировал под только что открытым фрагментом.Мое решение было простым, я добавил
.remove(CourseListFragment.this)
CourseListFragment — это файл класса для фрагмента, который я пытался закрыть.(MainActivity.java, но для конкретного раздела (фрагмент ящика навигации), если это имеет больше смысла для вас), так что мой код выглядит так сейчас:
LecturesFragment nextFrag= new LecturesFragment();
getActivity().getSupportFragmentManager().beginTransaction()
.remove(CourseListFragment.this)
.replace(((ViewGroup)getView().getParent()).getId(), nextFrag, "findThisFragment")
.addToBackStack(null)
.commit();
И это работает как шарм для меня.