2010-07-08 26 views
14

Estoy tratando de convertir un par de botones en un componente reutilizable en Android. Logré que la parte de XML/UI funcione correctamente, pero no puedo encontrar la manera de hacer código reutilizable entre actividades, sin recodificarlo en todas partes. Soy nuevo en Android, así que me disculpo si esto es obvio.Reutilizando el diseño XML y el código detrás de

Ya he revisado esta publicación varias veces: Android layout Tricks 3 - Part 1 pero parece que faltan algunos archivos, y no tengo suficiente experiencia para reconstruirlos.

Un dumbed versión de mi diseño principal:

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

    <WebView android:id="@+id/webview" 
     android:layout_width="fill_parent" 
     android:layout_height="375px" 
     android:layout_alignParentTop="true" /> 

     <include layout="@layout/navbar"/> 

</RelativeLayout> 

y después de mi "componente":

<?xml version="1.0" encoding="UTF-8"?> 
<merge xmlns:android="http://schemas.android.com/apk/res/android"> 
     <LinearLayout 
      android:orientation="horizontal" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:gravity="center"> 

      <ImageButton android:id="@+id/Button1" 
       android:layout_width="71px" 
       android:layout_height="wrap_content" 
       android:background="@drawable/button1"    
       android:layout_alignParentBottom="true" /> 


      <ImageButton android:id="@+id/Button2" 
       android:layout_width="75px" 
       android:layout_height="wrap_content" 
       android:background="@drawable/button1" 
       android:layout_toRightOf = "@+id/Button1" 
       android:layout_alignParentBottom="true" />    

     </LinearLayout> 
     </merge> 

Si tiene alguna críticas adicionales en mi XML, le agradecería que también .

Respuesta

16

Lo que hago es crea un componente real que contiene todo el código común y usarlo directamente. He aquí una versión callados de la clase de componente:

public class NavigationBar extends LinearLayout { 
    public NavigationBar(Context context) { 
     super(context); 
     setupView(context); 
     hookupButtons(context); 
    } 
    public NavigationBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setupView(context); 
     hookupButtons(context); 
    } 
    private void setupView(Context context) { 
     LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     // inflate whatever layout xml has your common xml 
     inflater.inflate(R.layout.navigation_bar, this); 
    } 
} 

En mis hookupButtons clase hace exactamente lo que creo que haría. :-)

Entonces mi en todos mis XMLs de diseño similar a esto:

<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <com.dragonglobal.dragonplayer.ui.widgets.NavigationBar 
     android:id="@+id/nav_bar" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" /> 
    <ListView 
     android:id="@+id/list_of_playlists" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 
</LinearLayout> 

En el onCreate de cada actividad también tengo esto (que puede adaptarse a lo que sea necesario):

NavigationBar navbar = (NavigationBar) findViewById(R.id.nav_bar); 
navbar.setText("Playlists"); 

Por supuesto, tendrá que agregar las importaciones que necesite.

EDITAR

Sólo una aclaración: Mi navigation_bar.xml se ve muy similar a la suya, excepto que no tengo las líneas de combinación en la mía.

EDITAR 2

Esto es lo que hookupButtons se parece. Solo estoy mostrando un botón, pero debes tener la idea.

private void hookupButtons(final Context context) { 
    ImageButton playlistsBtn = (ImageButton)findViewById(R.id.nav_playlists_btn); 
    if (context instanceof PlaylistsActivity) { 
     playlistsBtn.setBackgroundDrawable(getResources().getDrawable(R.drawable.nav_playlists_active)); 
    } else { 
     playlistsBtn.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(context, PlaylistsActivity.class); 
       i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
       context.startActivity(i); 
      } 
     }); 
    } 
} 
+0

Gracias, esto es lo que estoy buscando. ¿Puedes elaborar sobre HookupButtons? Lo siento, soy un principiante. – reuscam

0

Al utilizar en diseño XML, solo hace que el diseño sea reutilizable, no cualquier código Java que lo use.

Debe crear una subclase de Vista, si también desea reutilizar la lógica de Java. El tutorial de su enlace tiene una muestra que se adapte a sus necesidades muy bien:

public class OkCancelBar extends LinearLayout { 
... 
+0

Como dije antes, traté de seguir esa muestra, pero no compila. – reuscam

Cuestiones relacionadas