Question:
What I'm trying to do is move from one fragment to another when a button is pressed, the code I'm using is:
public class DimensionFragment extends Fragment {
Button Bmeters,
Bfeet;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
//return inflater.inflate(R.layout.fragment_dimension, container, false);
View view = inflater.inflate(R.layout.fragment_dimension, container, false);
Bmeters = (Button) view.findViewById(R.id.buttonmeters);
Bmeters.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent Bmeters = new Intent( getActivity() ,Meters.class);
startActivity(Bmeters);
}
});
Bfeet=(Button)view.findViewById(R.id.buttonfeet);
return view;
}
Pero me sale el siguiente error cuando ejecuto
04-26 12:06:04.705
3879-3879/com.example.liantonypozo.calculosmatematicos3
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.liantonypozo.calculosmatematicos3, PID: 3879
android.content.ActivityNotFoundException: Unable to find explicit
activity class
{com.example.liantonypozo.calculosmatematicos3/com.example.liantonypozo.calculosmatematicos3.DimensionFragment};
have you declared this activity in your AndroidManifest.xml?
at
android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1805)
at
android.app.Instrumentation.execStartActivity(Instrumentation.java:1523)
at android.app.Activity.startActivityForResult(Activity.java:4225)
at
android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at
android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at
android.support.v4.app.ActivityCompatJB.startActivityForResult(ActivityCompatJB.java:30)
at
android.support.v4.app.ActivityCompat.startActivityForResult(ActivityCompat.java:146)
at
android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.java:932)
at
android.support.v4.app.FragmentActivity$HostCallbacks.onStartActivityFromFragment(FragmentActivity.java:1047)
at android.support.v4.app.Fragment.startActivity(Fragment.java:940)
at android.support.v4.app.Fragment.startActivity(Fragment.java:929)
at
com.example.liantonypozo.calculosmatematicos3.Fragmen2$2.onClick(Fragmen2.java:52)
at android.view.View.performClick(View.java:5637)
at android.view.View$PerformClick.run(View.java:22429)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Answer:
Es mejor trabajar con fragments separados.
por ejemplo crear un propio Layout para el fragment
fragment_meters_layout.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/texto_fragment"
android:layout_gravity="center"
android:layout_margin="15dp"
android:padding="15dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textAlignment="center" />
it is just an example.
Then you declare a class that controls it, like you're doing in your other fragment.
FragmentMeter.java
public class FragmentMain extends Fragment {
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View vista = inflater.inflate(R.layout.fragment_meter_layout, container, false);
return vista;
}
}
the Layout of your activity should be something like this
activity_main.xml
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
......
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/contenedor">
</RelativeLayout>
....
If you have your fragments like this, and your activity with a layout that will contain the fragments.
So in your click event you do the following:
Bmeters = (Button) view.findViewById(R.id.buttonmeters);
Bmeters.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentMeter fr=new FragmentMeter();
fr.setArguments(bn);
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.contenedor,fr)
.addToBackStack(null)
.commit();
}
});
from a fragment you can access
getSupportFragmentManager() from your activity with getActivity()
The activity is the one who will change the fragment inside it, that is why the activity of the fragment should be called