2012-05-02 22 views
7

Soy bastante nuevo en Android, por lo que esta podría tener una respuesta obvia, pero parece que no puedo encontrarlo.Android: Agregar un fragmento a una actividad

Estoy escribiendo una versión de una aplicación de calculadora. Quiero hacer que cuando un usuario haga clic en uno de los botones, se inicie un fragmento (con más botones que puedan usarse para obtener más información).

El fragmento de código es el siguiente:

import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class VariableMenu extends Fragment { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);} 

    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

    } 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     return inflater.inflate(R.layout.fragment, container, false); 
} 

} 

con un diseño XML de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

<Button 
     android:id="@+id/Bx" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="X" 
     android:onClick="onButtonClicked"/> 
    <Button 
     android:id="@+id/By" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/Bx" 
     android:layout_alignTop="@id/Bx" 
     android:text="Y" 
     android:onClick="onButtonClicked"/> 
    <Button 
     android:id="@+id/Bz" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toRightOf="@id/By" 
     android:layout_alignTop="@id/By" 
     android:text="Z" 
     android:onClick="onButtonClicked"/> 

</RelativeLayout> 

(Sé que no debería usar cadenas codificadas de forma rígida, pero lo arreglar eso una vez que lo ejecute)

He intentado que se agregue usando una transacción fragmentada con el método onTouch del botón de activación, así:

public void onFragmentActivated(View v) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     VariableMenu fragment = new VariableMenu(); 
     fragmentTransaction.add(R.layout.main, fragment); 
     fragmentTransaction.commit(); 
    } 

pero dio un error diciendo que "No se encontró vista para id: ... (main) para el fragmento VariableMenu".

Entonces hice una vista para que en el principal archivo XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

(Irrelevant things) 

    <fragment 
     android:id="@+id/Fragment" 
     android:name="calculator.app.VariableMenu" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/B1"/> 

(Irrelevant things) 

</RelativeLayout> 

Pero esto resultó en el fragmento de estar allí tan pronto como se creó la actividad (y setContentView (R.layout.main) ; corrió).

¿Hay una manera simple de agregar y quitar mediante programación un fragmento con una IU a una actividad?

Respuesta

11

El problema aquí es que el fragmento necesita un contenedor con una ID de ID para residir dentro. Darle una ID de diseño dará como resultado el error que vio.

Puede agregar el fragmento a su diseño relativo, pero para hacerlo correctamente deberá asignarle los parámetros de diseño adecuados para que pueda colocarlo. Sería más fácil simplemente crear un FrameLayout dentro del diseño relativo que envuelve sus contenidos, y luego agregar el fragmento allí.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <FrameLayout 
     android:id="@+id/FragmentContainer" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/B1"/> 

</RelativeLayout> 

Entonces

fragmentTransaction.add(R.id.FragmentContainer, fragment); 
+1

+1. @Spencer también, si tu fragmento puede actuar como una actividad separada, puedes cambiarlo para extender FragmentActivity y tratarlo como una actividad normal – Joe

+0

Muchas gracias, funcionó perfectamente. No creo que FragmentActivity funcione en este caso, pero tendré en cuenta esa opción para el futuro. – Spencer

Cuestiones relacionadas