2011-12-01 7 views
6

Estoy intentando crear un reproductor de música que será visible en todas mis actividades. Para hacer esto, voy a usar un Fragment como algunos de ustedes me aconsejaron anteriormente.Fragmento no se muestra después de inflar [Solucionado, pero ...]

Como no tengo ninguna experiencia con Fragments en absoluto, decidí implementar primero un fragmento en una actividad de "relleno". Creé un fragmento simple que contiene solo un botón y algo de texto, y trato de inflar eso en mi actividad de relleno.

Sin embargo, después de inflar este fragmento no aparece. Un mensaje se imprime en LogCat y me dice que el fragmento se ha estado inflando.

Estoy bastante seguro de que me falta algo, pero como no tengo experiencia con esto y no pude encontrar un tutorial que explicara cómo hacerlo, no sé qué es lo que hago. me falta

reproductor de música Fragmento diseño

public class AppMusicPlayer extends Fragment{ 


    @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      // Inflate the layout for this fragment 
     System.out.println("fragment added"); 
      return inflater.inflate(R.layout.musicplayer_main, container, false); 
     } 


} 

reproductor de música

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


    <Button 
     android:id="@+id/button1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="Button" /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="This is the fragment you're looking for" /> 

</LinearLayout> 

relleno Actividad

public class Filler extends FragmentActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.filler); 

     Button b = (Button) findViewById(R.id.terug); 
     b.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View arg0) { 
       Intent intent = new Intent(); 
       setResult(RESULT_OK, intent); 
       finish(); 
      } 
     }); 

    } 

} 

relleno diseño

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 
<!-- Title bar --> 
    <RelativeLayout 
     android:id="@+id/linearLayout1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:adjustViewBounds="true" 
     android:background="@drawable/title_bar" > 

     <TextView 
      android:id="@+id/fillertitle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerHorizontal="true" 
      android:layout_centerVertical="true" 
      android:text="Work In Progress" 
      android:textAppearance="?android:attr/textAppearanceLarge" 
      android:textStyle="bold" > 
     </TextView> 

     <Button 
      android:id="@+id/terug" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:layout_centerVertical="true" 
      android:background="@drawable/button_back" 
      android:text="Back" 
      android:textColor="#FFFFFFFF" 
      android:textStyle="bold" > 
     </Button> 
    </RelativeLayout> 
<!-- End of title bar --> 
    <TextView 
     android:id="@+id/wip" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="This section of the app has not been made yet. Work in progress." > 
    </TextView> 

    <fragment 
     android:id="@+id/musicPlayerFragment" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:name="com.mobowski.app.player.AppMusicPlayer" /> 

</LinearLayout> 

Obviamente que estoy haciendo algo mal, pero ¿qué?

Nota: Estoy usando Android 2.3 con la biblioteca de compatibilidad.

Cualquier ayuda se agradece


El problema se ha solucionado con la ayuda de Yashwanth Kumar y blessenm. Uno dio una solución XML, el otro una solución programática. Ahora me pregunto qué solución es la más conveniente. ¿Hay alguna concesión que hacer con cualquiera de las soluciones, o todo se reduce a la solución preferida del programador?

+1

Si solo usa un 'Fragmento' específico y nunca tiene la intención de cambiarlo, diría que sería preferible el modo xml. Si tiene la intención de intercambiar 'Fragmentos' cuando la aplicación se está ejecutando, agregando el' Fragmento' programáticamente podría ser conveniente controlar el flujo (p.sabes qué 'Fragmento' se muestra y con cuál intercambiar). – kaspermoerch

+0

Muy bien, me quedaré con XML, ya que (al menos por ahora) el reproductor de música será el único 'Fragmento'. ¡Gracias por la respuesta! –

Respuesta

9

No he intentado agregar fragmentos directamente a xml. Pero lo que normalmente hago es agregar un framelayout o linearlayout al diseño de relleno.

Supongamos que su id es 'titular_fragmentos'. Utilizo el siguiente código en la actividad del fragmento justo después de setContentView. Pruebe esto

FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
ft.add(R.id.fragment_holder,new AppMusicPlayer(),"musicplayer"); 
ft.commit(); 
+0

Desearía poder aceptar tanto tu respuesta como la de Yashwanth. Ambas respuestas funcionaron perfectamente. Ahora me pregunto cuál sería la "mejor" elección, añadiéndola en XML o añadiéndola programáticamente. ¿Hay alguna convención para eso? –

+0

yashwanths fue la respuesta correcta. El mío es solo una solución alternativa. – blessenm

+0

Cambié mi respuesta aceptada. Después de rebuscar con el fragmento, no pude agregarlo correctamente a un framelayout, sin embargo, su método funcionó perfectamente. Así que gracias de nuevo –

7

debe mencionar layout_height como 0dip, no el ancho en el diseño lineal vertical.

cambiar que debería funcionar.

<fragment 
     android:id="@+id/musicPlayerFragment" 
     android:layout_width="wrap_content" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:name="com.mobowski.app.player.AppMusicPlayer" /> 
+0

Desearía poder aceptar tanto su respuesta como la de Blessen. Ambas respuestas funcionaron perfectamente. Ahora me pregunto cuál sería la "mejor" elección, añadiéndola en XML o añadiéndola programáticamente. ¿Hay alguna convención para eso? –

Cuestiones relacionadas