如何从另一个片段打开一个新片段?

我尝试在片段之间进行导航。我已经让 NewFragment.java和新片段一起工作了。我的问题是:

如何使这个 onClickListener正确地运行 NewFragment.java

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


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


}
});

仅供参考: 这是来自一个片段内部(我不知道这是否重要)。

178584 次浏览

You should create a function inside activity to open new fragment and pass the activity reference to the fragment and on some event inside fragment call this function.

Add following code in your click listener function,

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

The string "findThisFragment" can be used to find the fragment later, if you need.

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

This is more described code of @Narendra's code,

First you need an instance of the 2nd fragment. Then you should have objects of FragmentManager and FragmentTransaction. The complete code is as below,

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();

Hope this will work. In case you use androidx, you need getSupportFragmentManager() instead of getFragmentManager().

Use this,

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();

Just to be precise, R.id.viewpagerId is cretaed in your current class layout, upon calling, the new fragment automatically gets infiltrated.

Adding to @Narendra solution...

IMPORTANT: When working with fragments, navigations is closely related to host acivity so, you can't justo jump from fragment to fragment without implement that fragment class in host Activity.

Sample:

public class MyHostActivity extends AppCompatActivity implements MyFragmentOne.OnFragmentInteractionListener {

Also, check your host activity has the next override function:

@Override public void onFragmentInteraction(Uri uri) {} Hope this helps...

Well my problem was that i used the code from the answer, which is checked as a solution here, but after the replacement was executed, the first layer was still visible and functionating under just opened fragment. My solution was simmple, i added

.remove(CourseListFragment.this)

the CourseListFragment is a class file for the fragment i tried to close. (MainActivity.java, but for specific section (navigation drawer fragment), if it makes more sense to you) so my code looks like this now :

LecturesFragment nextFrag= new LecturesFragment();


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

And it works like a charm for me.

Using Kotlin to replace a Fragment with another to the container , you can do

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

first of all, give set an ID for your Fragment layout e.g:

<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">

and use that ID to replace the view with another fragment.java file. e.g

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

For Kotlin simply you can use this,

First: Create new instance of the fragment

val newFragment = NewFragment.newInstance()

Second: Start the fragment transaction

val fragmentTransaction: FragmentTransaction = activity!!.supportFragmentManager.beginTransaction()

Third: Replace current fragment with new fragment ( tips: avoid using id of the container view like R.id.fl_fragment, you may face view not find error, just use is at mentioned below)

fragmentTransaction.replace(
(view!!.parent as ViewGroup).id,newFragment
)

Final Steps:

fragmentTransaction.addToBackStack(null)
fragmentTransaction.commit()

a simple option is to navigate to the second fragment by defining an action in the nav_graph.xml and then use it like this (example for Kotlin):

rootViewOfFirstFragment.someBtn.setOnClickListener{
Navigation.findNavController(rootViewOfFirstFragment)
.navigate(R.id.action_firstFragment_to_secondFragment)
}

use this in adapter/fragment all previous methouds are expired now

((AppCompatActivity) context).getSupportFragmentManager().beginTransaction().replace(R.id.container,new cartFragment()).commit();

My how things do change in 8 years time. If you are using NavigationController in your app this is very simple. In your mobile_navigation.xml file you need to create "from" and "to" fragments. In the "from" fragment add the destination id of the "to" fragment.

<?xml version="1.0" encoding="utf-8"?>
<navigation 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:id="@+id/mobile_navigation"
app:startDestination="@+id/nav_home">


<fragment
android:id="@+id/nav_home"
android:name="com.yourpackage.FromFragment"
android:label="@string/menu_home"
tools:layout="@layout/from_fragment" >
<action android:id="@+id/action_go"
app:destination="@id/dest_fragment"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim"
app:popEnterAnim="@anim/nav_default_pop_enter_anim"
app:popExitAnim="@anim/nav_default_pop_exit_anim"/>
</fragment>


<fragment
android:id="@+id/dest_fragment"
android:name="com.yourpackage.ToFragment"
android:label="To Fragment"
tools:layout="@layout/to_fragment" />
</navigation>

Then in your onClick handler call:

Navigation.findNavController(view).navigate(R.id.action_go);

This page provides more details including how to set up the destination programmatically.

https://developer.android.com/guide/navigation/navigation-navigate