Як відкрити новий фрагмент з іншого фрагмента?


79

Я спробував зробити навігацію між фрагментами. Я працюю NewFragment.javaз новим фрагментом. Моя проблема:

Як мені зробити цей onClickListenerзапуск NewFragment.javaправильно?

button.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {

        Intent i = new Intent(getActivity(), NewFragment.class);
        startActivity(i);

    }
});

FYI: Це всередині фрагмента (я не знаю, чи це має значення).


ВАЖЛИВО: Під час роботи з фрагментами навігація тісно пов’язана з активністю хосту, тому ви не можете просто переходити від фрагмента до фрагмента, не застосувавши цей клас фрагментів у Activity Activity. Зразок: public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener { Також перевірте, чи має активність вашого хосту наступну функцію заміни: `@Override public void onFragmentInteraction (Uri uri) {}` Сподіваюся, це допомагає ...
Gerry R

Відповіді:


148

Додайте наступний код у свою функцію прослуховування кліків,

NextFragment nextFrag= new NextFragment();
getActivity().getSupportFragmentManager().beginTransaction()
             .replace(R.id.Layout_container, nextFrag, "findThisFragment")
             .addToBackStack(null)
             .commit();

Рядок "findThisFragment"можна використовувати для подальшого пошуку фрагмента, якщо вам це потрібно.


13
що буде Layout_container?
Шайлендра Мадда

5
хтось може пояснити, що Layout_containerповинно бути?
Хью Девіс,

8
Layout_container - це ідентифікатор поточного фрагмента. Я б рекомендував використовувати ((ViewGroup) .getView (). GetParent ()). GetId () замість R.id.Layout_container.
BTR Naidu

layout_container - це ідентифікатор подання, присутній у макеті діяльності, де ви хочете замінити фрагмент
Асад Алі,

9
@BTRNaidu Має бути: ((ViewGroup) getView (). GetParent ()). GetId ();
KvnH

9

Це більш описаний код коду @ Narendra,

Спочатку вам потрібен екземпляр 2-го фрагмента. Тоді у вас повинні бути об’єкти 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();

Сподіваюся, це спрацює. Якщо ви використовуєте android x , вам потрібен getSupportFragmentManager () замість getFragmentManager ().


і що було content_mainб?
Хью Девіс,

1
@HuwDavies значення id батьківського перегляду у файлі макета Activity Activity. Приклад: <FrameLayout android: id = "@ + id / fragment_container" android: layout_width = "match_parent" android: layout_height = "match_parent" />
Eaweb

4

Вам слід створити функцію всередині активності, щоб відкрити новий фрагмент і передати посилання на активність фрагменту, а для якоїсь події всередині фрагмента викликати цю функцію.


2
Зсередини фрагмента у вас автоматично вже є посилання на батьківську активність. Використовуйте функцію getActivity (), або якщо ви використовуєте функцію onAttach, то дія в аргументах.
miva2

3

Використовуй це,

AppCompatActivity activity = (AppCompatActivity) view.getContext();
Fragment myFragment = new MyFragment();
activity.getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, myFragment).addToBackStack(null).commit();

Я отримую помилку addView (Перегляд) не підтримується в AdapterView, коли я використовую цей код всередині customadapter, який поширюється від listadapter ... як це слід змінити?
stefanosn

2
@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();  
}

Де content_frame? Макет кадру?
luke cross

2

Ви можете використовувати Kotlin для заміни a Fragmentіншим на thecontainer

button.setOnClickListener {
    activity!!
        .supportFragmentManager
        .beginTransaction()
        .replace(R.id.container, NewFragment.newInstance())
        .commitNow()
}

0
 Fragment fr = new Fragment_class();
             FragmentManager fm = getFragmentManager();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.add(R.id.viewpagerId, fr);
            fragmentTransaction.commit();

R.id.viewpagerIdАби бути точнішим, він кредується у вашому поточному макеті класу, після виклику новий фрагмент автоматично потрапляє в нього.


0

Додавання до рішення @Narendra ...

ВАЖЛИВО: Під час роботи з фрагментами навігація тісно пов’язана з активністю хосту, тому ви не можете просто переходити від фрагмента до фрагмента, не застосувавши цей клас фрагментів у Activity Activity.

Зразок:

public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener {

Крім того, перевірте, чи має активність хосту наступну функцію заміни:

@Override public void onFragmentInteraction(Uri uri) {} Сподіваюся, це допомагає ...


0

Ну, моя проблема полягала в тому, що я використав код із відповіді, який тут перевіряється як рішення, але після виконання заміни перший шар все ще був видимим і функціонував під щойно відкритим фрагментом. Моє рішення було простим, я додав

.remove(CourseListFragment.this)

CourseListFragment - це файл класу для фрагмента, який я намагався закрити. (MainActivity.

LecturesFragment nextFrag= new LecturesFragment();

                    getActivity().getSupportFragmentManager().beginTransaction()
                            .remove(CourseListFragment.this)
                            .replace(((ViewGroup)getView().getParent()).getId(), nextFrag, "findThisFragment")
                            .addToBackStack(null)
                            .commit();

І це працює як принада для мене.


0

Перш за все, вкажіть ідентифікатор вашого макета Фрагменту, наприклад:

<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
**android:id="@+id/cameraFragment"**
tools:context=".CameraFragment">

і використовуйте цей ідентифікатор, щоб замінити подання на інший файл fragment.java. напр

 ivGallary.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          UploadDoc uploadDoc= new UploadDoc();
          (getActivity()).getSupportFragmentManager().beginTransaction()
                  .replace(**R.id.cameraFragment**, uploadDoc, "findThisFragment")
                  .addToBackStack(null)
                  .commit();
      }
  });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.