PDA

Ver la Versión Completa : [ CONSULTA ] Como mostrar un Fragment desde otro Fragment


SoCu
30/09/18, 11:19:43
Hola, os agradecería si me podéis ayudar a ver porque no puedo mostrar un Fragment.

Tengo creado dos clases que extienden de Fragment, en una tengo puesto varios botones, unos botones muestran un archivo y otros muestran una página web.
El problema es que al pulsar sobre un botón para que muestre el otro Fragment, no hace nada, ni me muestra ningún mensaje de error.

Clase donde tengo puesto dos botones extiende de Fragment, uno de ellos llama una clase Activity y otro una clase Fragment, el botón del Activity si se muestra, y el Fragment no.

PDF.JAVA (hay más botones, para el ejemplo solo he dejado dos)


public class PDF extends Fragment {

Button botonAdobe2;
ImageButton botonEsquema;



public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate( R.layout.pdf, container, false );

botonAdobe2 = rootView.findViewById(R.id.btAdobe2);
botonEsquema = rootView.findViewById(R.id.btEsquema);


botonAdobe2.setOnClickListener(new View.OnClickListener() {
override
public void onClick(View view) {
Intent intent = new Intent(getActivity(),PDF_2.class);
startActivity(intent);
}
});


botonEsquema.setOnClickListener(new View.OnClickListener() {
override
public void onClick(View view) {
Esquema_SG_M fragment = new Esquema_SG_M();
FragmentTransaction ftEs = getFragmentManager().beginTransaction();
ftEs.replace(R.id.frame_container, fragment);
ftEs.addToBackStack(null);
ftEs.commit();

}
});

return rootView;
}
}


pdf.XML


<android.support.constraint.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:id="@+id/frameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.SoCu.CirDocu.PDF">

<Button
android:id="@+id/btAdobe2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="56dp"
android:layout_marginTop="44dp"
android:background="@android:color/transparent"
android:drawableStart="@drawable/icon_adobe"
app:layout_constraintStart_toEndOf="@+id/btAdobe1"
app:layout_constraintTop_toBottomOf="@+id/btGGGG" />

<ImageButton
android:id="@+id/btEsquema"
android:layout_width="125dp"
android:layout_height="65dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="128dp"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:background="@android:color/transparent"
android:src="@drawable/esquema_sg_m"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.9"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btAdobe2"
app:layout_constraintVertical_bias="0.0" />

</android.support.constraint.ConstraintLayout>


Esquema_SG_M.JAVA muestra una pagina web que esta en una carpeta local (memoria del telefono)


public class Esquema_SG_M extends Fragment {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

private String mParam1;
private String mParam2;

WebView mWebView;

private OnFragmentInteractionListener mListener;

public Esquema_SG_M() {
}


public static Esquema_SG_M newInstance(String param1, String param2) {
Esquema_SG_M fragment_SG = new Esquema_SG_M();
Bundle args = new Bundle();
args.putString( ARG_PARAM1, param1 );
args.putString( ARG_PARAM2, param2 );
fragment_SG.setArguments( args );
return fragment_SG;
}
override
public void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );

if (getArguments() != null) {
mParam1 = getArguments().getString( ARG_PARAM1 );
mParam2 = getArguments().getString( ARG_PARAM2 );
}
}
override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

View view = inflater.inflate( R.layout.esquema_sg_m, container, false );

mWebView = view.findViewById( R.id.webView_sg_m );
mWebView.getSettings().setJavaScriptEnabled( true );
mWebView.getSettings().setAppCacheEnabled( true );

mWebView.getSettings().setBuiltInZoomControls( true );
mWebView.getSettings().setDisplayZoomControls( false );
mWebView.getSettings().setSupportZoom( true );
mWebView.getSettings().setDefaultZoom( WebSettings.ZoomDensity.FAR );
mWebView.getSettings().setLoadWithOverviewMode( true );
mWebView.getSettings().setUseWideViewPort( true );
mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_ OVERLAY);
mWebView.setScrollbarFadingEnabled(false);

mWebView.loadUrl("file:///pagina_web_local.html");

return view;
}

public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}


override
public void onDetach() {
super.onDetach();
mListener = null;
}

public interface OnFragmentInteractionListener {
void onFragmentInteraction(Uri uri);
}

}


esquema_sg_m.xml


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Esquema_SG_M">

<WebView
android:id="@+id/webView_sg_m"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</FrameLayout>


No es que estoy muy puesto en programación con Android, pero la información que he visto en páginas web y video, parece que es este el código para mostrar un Fragment desde otro Fragment.

Sabe alguien porque no me funciona?

Gracias.

mocelet
01/10/18, 10:42:16
Para los fragment anidados en vez del getFragmentManager tienes que usar el getChildFragmentManager

SoCu
01/10/18, 16:22:22
Hola mocelet. Estoy con el móvil y no estoy delante del ordenador pata volver hacer otra prueba, pero ese código ya lo probé en una ocasión y no me funcionó, igual no lo hice bien

Salu2

SoCu
03/10/18, 21:44:02
Hola mocelet, estoy probando pero al poner getChildFragmentManager() la aplicación se cierra.

Nada mas pulsar el boton que contiene ese codigo, muestra un mensaje y se cierra.


Salu2.

mocelet
03/10/18, 22:46:47
Al menos ya hace algo, que se cierre la app es una bendición porque miras el error en el logcat y vas tirando del hilo hasta que funcione bien.

SoCu
04/10/18, 07:35:01
el mensaje que puestra al pulsar el boton es este:

E/FragmentManager: No view found for id 0x7f080063 (com.SoCu.CirDocu:id/frame_container) for fragment Esquema_SG_M{8246bf6 #0 id=0x7f080063}
2018-10-04 07:29:16.414 7021-7021/com.SoCu.CirDocu E/FragmentManager: Activity state:
2018-10-04 07:29:16.505 7021-7021/com.SoCu.CirDocu E/AndroidRuntime: FATAL EXCEPTION: main Process: com.SoCu.CirDocu, PID: 7021

Hay mas texto pero creo que es este el texto que pude dar alguna pista, no se si es que no se puede mostrar un fragment por otro, pero me deja igual, no se si a ti te dice algo que de alguna pista de donde esta el problema.


Salu2.

mocelet
04/10/18, 09:03:35
Volviendo a leer la pregunta debí entender mal y no tienes fragments anidados (un fragment dentro de otro). ¿Qué es lo que tienes exactamente? ¿Una actividad con dos fragments que están en pantalla a la vez?

Podrías poner el layout que cargas en la actividad a ver exactamente qué quieres cambiar.

Lo habitual para mantener código limpio y evitar problemas es que los fragments no tengan lógica de aplicación y llamen a un método de la actividad padre que se dedique a orquestar qué fragments hay que cargar o si hay que lanzar otra actividad.

SoCu
04/10/18, 11:20:16
Hola mocelet, intentare explicarme lo mejor que pueda, que no estoy muy puesto en programación con Android y meto cada palabro que igual no tiene nada que ver, jeje,

Veras, tengo un menú horizontal que se encuentra en el MainActivity con la clase AppCompatActivity, al pulsar en uno de sus menus/opciones, me muestra una clase Fragment, en este Fragment tengo cuesto unos botones que llaman a unas clases que extienden de AppCompatActivity y otras de Frangmen.

Los botones que llaman a las clases AppCompatActivity se abren bien, bueno más o menos, pero eso es tema para otra pregunta.
Y los botones que llaman a las clases Fragment no hace nada, ni se entera de que lo estoy pulsando, ni muestra ningún error.

A ver si es esto por lo que me preguntas…..

Ese código de arriba es de un botón para abrir otro Fragmente, que está en PDF.java y el pdf.xml es este:

<android.support.constraint.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:id="@+id/frameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.SoCu.CirDocu.PDF">

<Button
android:id="@+id/btRRRR"
android:layout_width="115dp"
android:layout_height="103dp"
android:layout_marginStart="16dp"
android:layout_marginTop="150dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="448dp"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:contentDescription="@string/retraso"
android:drawableStart="@drawable/ultima_si"
android:scaleType="fitCenter"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/btGGGG"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.761" />


<Button
android:id="@+id/btGGGG"
android:layout_width="214dp"
android:layout_height="108dp"
android:layout_marginStart="8dp"
android:layout_marginTop="150dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="443dp"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:contentDescription="@string/gi_f"
android:drawableStart="@drawable/gi_f"
android:scaleType="fitCenter"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/btRRRR"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.761" />

<Button
android:id="@+id/btAdobe1"
android:layout_width="62dp"
android:layout_height="wrap_content"
android:layout_marginStart="37dp"
android:layout_marginTop="52dp"
android:layout_marginBottom="357dp"
android:background="@android:color/transparent"
android:contentDescription="@string/adobe_pdf"
android:drawableStart="@drawable/icon_adobe"
android:scaleType="fitCenter"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btRRRR"
app:layout_constraintVertical_bias="0.272" />

<Button
android:id="@+id/btAdobe2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="56dp"
android:layout_marginTop="44dp"
android:background="@android:color/transparent"
android:drawableStart="@drawable/icon_adobe"
app:layout_constraintStart_toEndOf="@+id/btAdobe1"
app:layout_constraintTop_toBottomOf="@+id/btGGGG" />

<Button
android:id="@+id/btApuntes"
android:layout_width="75dp"
android:layout_height="77dp"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="8dp"
android:background="@android:color/transparent"
android:contentDescription="@string/Apuntes"
android:drawableStart="@drawable/icon_apuntes"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.694"
app:layout_constraintStart_toEndOf="@+id/btAdobe2"
app:layout_constraintTop_toBottomOf="@+id/btGGGG" />

<ImageButton
android:id="@+id/btEsquema"
android:layout_width="125dp"
android:layout_height="65dp"
android:layout_marginBottom="8dp"
android:layout_marginEnd="128dp"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:background="@android:color/transparent"
android:src="@drawable/esquema_sg_m"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.9"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btAdobe2"
app:layout_constraintVertical_bias="0.0" />

</android.support.constraint.ConstraintLayout>

Y el otro Fragment se llama Esquema_SG_M.java y su layaut es esquema_sg_m.xml que lo que muestra es una pagina web local

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Esquema_SG_M">

<WebView
android:id="@+id/webView_sg_m"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</FrameLayout>


Salu2.

Merche300
12/10/18, 13:13:15
Que tal si pones el codigo java en vez de los .xml?

SoCu
12/10/18, 18:40:32
Pero si el codigo que utilizo para ir al otro fragment en el java esta puesto en el primer.

Después mocelet me pidio el codigo que utilizo en los xml, y lo he puesto, supongo que sera eso lo que me pedía, porque después de ponerlo ya no ha comentado nada.

Salu2.

mocelet
12/10/18, 22:55:09
Cierto, iba a contestar "más tarde" y ya sabes qué pasa jeje, me refería al layout de la actividad, no de los fragmentos.

Pero vamos, era por ver si los ids eran los mismos, ya es raro que no te dé ningún mensaje de error ni en el logcat y que no salga nada en pantalla al hacer el replace y el commit.

Porque supongo que el fragmento nuevo carga su vista correctamente, que a ver si por lo que sea no lo está haciendo.

SoCu
13/10/18, 09:13:11
Hola, a ver si me entero de lo que me pedís, los códigos que he puesto no es lo que me pedís, en el primer post está el que tengo puesto en la clase Activity, archivo con extensión JAVA
Y luego he puesto el que tengo en el layout, archivo XML

Voy a editar el primer post para poner el código completo, no he querido ponerlo todo porque me da la impresión de que cuando lo he puesto todo, hay quien lo ve y al poner tanto código pasa de responder.


Salu2.

mocelet
15/10/18, 12:27:21
¿Dónde está definido frame_container? A ver si va a estar oculto o cualquier cosa. Tendrías que comprobar si está cambiando el fragment y el problema es que no se ve porque no hay nada que mostrar o si el problema es que el fragment no llega a cargarse (aunque entonces debería darte error)

Por cierto, ¿dónde está el return de public View onCreateView del fragment Esquema_SG_M?

SoCu
16/10/18, 09:07:46
El frame_container está en el activity_main.xml, y lo de ver si está oculto, como puedo saber si está o no oculto.

Y lo de saber si se carga el fragment,

El return view me lo comí, también el cerrar la llave }, tengo puesto hay otro código, hay tengo puesto otro código para detectar si la página que tiene que mostrar no está, que muestre una página con un texto de error, pero ese código lo tengo ahora desactivado, y no llegue hasta el final copiando, por eso se me paso poner el return view

Y en el Logcat cuando pulso sobre el botón que debería de abrir el fragment, lo único que muestra es esta línea, que creo que no tiene nada que ver, supongo que es algo relacionado con el audio

W/audio_hw_generic: Not supplying enough data to HAL, expected position 75951871 , only wrote 75895200

Salu2.

SoCu
26/10/18, 20:32:31
Entonces hay algo que se pueda hacer ?


Salu2.

SoCu
22/11/18, 10:04:13
Hola mocelet, he cambiado un poco el código y ya puedo mostrar el Fragment,

Ahora he cambiado el código del botón, y muestra el Fragment,


verEsquema.setOnClickListener(new View.OnClickListener() {
override
public void onClick(View v) {
Fragment nuevoFragmento = new Esquema();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.replace(getView().getId(), nuevoFragmento);
transaction.addToBackStack(null);
transaction.commit();
}
});


Pero con un inconveniente, que ahora se muestran los dos Fragment.
Tengo puesto en un Fragment un botón desde el llamo a otro Fragment, al pulsar el botón se muestra el otro Fragment, pero se sigue quedando el Boton que hay puesto en el Fragment anterior.

http://funkyimg.com/i/2Nhhh.png

Que se puede hacer para que esto no ocurra?


Salu2.

mocelet
26/11/18, 11:16:09
Vaya lío jaja, ¿el botón que dices que no desaparece dónde está? Si el fragment se reemplaza correctamente pero el botón se queda es porque el botón no estará añadido al fragment anterior sino en otro sitio. O porque el fragment no llega a reemplazarse. O porque el nuevo fragment también tiene un botón... Más opciones no se me ocurren.

Los fragments de todas formas son un cacao en sí mismos y gestionar su ciclo de vida un pequeño infierno.

SoCu
27/11/18, 15:26:46
Hola mocelet perdona por no responderte antes, pero no he podido entrar, y estaba deseando hacerlo para ver si se puede solucionar.

El botón cuando se pulsa aparece el otro fragment debajo, y se sigue quedando el botón encima, y activo, quiero decir que si se vuelve a pulsar funciona.

Mira este video
https://youtu.be/VqIoDqR6lSY

El botón está en un fragment, que al pulsarlo llama a un segundo fragment, este segundo fragmen muestra la imagen y no tiene ningún botón, y como puedes ver si llega a reemplazarse, pero mostrándose los dos fragment.

P.D. el video de arriba lo he quitado por si lleva a confusión.

Salu2.