Come apro un nuovo frammento da un altro frammento?
-
21-12-2019 - |
Domanda
Ho provato a fare una navigazione tra frammenti.Ho il NewFragment.java
con il nuovo frammento che funziona.Il mio problema è:
Come faccio a rendere questo onClickListener
NewFragment.java
correttamente?
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getActivity(), NewFragment.class);
startActivity(i);
}
});
.
FYI: Questo è da dentro un frammento (non so se questo è importante).
Soluzione
Aggiungi il seguente codice nella funzione Fare clic con il tasto funzione Listener,
NextFragment nextFrag= new NextFragment();
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.Layout_container, nextFrag, "findThisFragment")
.addToBackStack(null)
.commit();
.
La stringa "findThisFragment"
può essere utilizzata per trovare il frammento in seguito, se avete bisogno.
Altri suggerimenti
Questo è il codice più descritto del codice @ Narendra,
Per prima cosa hai bisogno di un'istanza del 2 ° frammento.Allora dovresti avere oggetti di frammentmanager e frammenttracrazione.Il codice completo è come di seguito,
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();
.
Spero che funzionerà.A volte puoi ottenere getospportfragmentmanager () invece di getfragmentmanager ().
È necessario creare una funzione all'interno dell'attività per aprire il nuovo frammento e passare il riferimento dell'attività al frammento e su qualche evento all'interno del frammento chiama questa funzione.
@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();
}
. Usa questo,
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();
.
Solo per essere preciso, R.id.viewpagerId
è cretaato nel layout di classe attuale, dopo aver chiamato, il nuovo frammento si infiltra automaticamente.
Aggiunta a @Narendra Soluzione ...
IMPORTANTE: quando si lavora con i frammenti, le navigazioni sono strettamente correlate all'attività ospite, quindi non è possibile saltare dal frammento al frammento senza implementare quella classe di frammento in attività host.
Esempio:
public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener {
Inoltre, controlla la tua attività host ha la prossima funzione di override:
@Override
public void onFragmentInteraction(Uri uri) {}
Spero che questo aiuti ...
Beh, il mio problema è stato che ho usato il codice dalla risposta, che viene controllato come soluzione qui, ma dopo che la sostituzione è stata eseguita, il primo strato era ancora visibile e funzionante sotto il frammento appena aperto.La mia soluzione era SIMMPLE, ho aggiunto
.remove(CourseListFragment.this)
.
Il CourselistFragment è un file di classe per il frammento che ho provato a chiudere. (Mainactity.java, ma per la sezione specifica (frammento del cassetto di navigazione), se ne ha più senso per te) Quindi il mio codice è così:
LecturesFragment nextFrag= new LecturesFragment();
getActivity().getSupportFragmentManager().beginTransaction()
.remove(CourseListFragment.this)
.replace(((ViewGroup)getView().getParent()).getId(), nextFrag, "findThisFragment")
.addToBackStack(null)
.commit();
.
E funziona come un fascino per me.