Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Reutilizando XML de diseño y el código detrás

Estoy tratando de convertir un par de botones en un componente reutilizable en Android. He conseguido con éxito la porción de XML / UI que trabaja, pero no puedo imaginar cómo hacer detrás del código reutilizable entre las actividades, corto de la recodificación él por todas partes. Soy nuevo en Android, así que me disculpo si esto es obvio.

Ya he revisado este post varias veces: Disposición de Android Trucos 3 – Parte 1, pero parece que falta algunos archivos, y no tengo experiencia suficiente para reconstruirlos.

Una versión estúpida 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 luego 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ítica adicional sobre mi XML, yo también lo agradecería.

  • Android Studio no puede importar mis proyectos de Eclipse, ya sea directamente o como proyecto Gradle
  • Capacidad de llamadas telefónicas del dispositivo Android
  • ¿Cómo importar el proyecto de Android Studio en Eclipse?
  • Eclipse Android Emulator - Teclado no funciona
  • Posible obtener detalles de error específicos de Android SQLiteConstraintException?
  • No hay números de línea en Eclipse o en el editor de Android Studio XML.
  • Cómo obtener los eventos de searchview en android
  • Cómo blit () en android?
  • 2 Solutions collect form web for “Reutilizando XML de diseño y el código detrás”

    Lo que hago es crear un componente real que contenga todo el código común y lo utilice directamente. Aquí hay una versión 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 mi clase hookupButtons hace exactamente lo que crees que haría. Todos los derechos reservados

    Entonces mi en todos mis xmls de la disposición se parecen 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 la clase de cada actividad también tengo esto (que se puede adaptar a lo que usted necesita):

     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 tuya, excepto que no tengo las líneas de fusión en la mía.

    EDIT 2

    Aquí es lo que parece hookupButtons. Solo estoy mostrando un botón pero deberías 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); } }); } } 

    Usando en la disposición de XML, usted está haciendo solamente la disposición reutilizable, no cualquier código de Java que lo utilice.

    Debe crear una subclase de Vista, si también desea reutilizar la lógica de Java. El tutorial de su enlace tiene un ejemplo que se ajusta a su necesidad muy bien:

     public class OkCancelBar extends LinearLayout { ... 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.