2010-11-08 11 views
20

Vengo a ti con la rodilla doblada, pregunta en mano. Soy relativamente nuevo en Android, así que disculpe cualquier cosa sacrílega que pueda decir.Botón OnClick Oyente en diseños incluidos

Introducción: Tengo varios diseños en la aplicación, que todos tienen que incluir un pie de página común. Este pie de página tiene algunos botones esenciales para regresar a la página de inicio, cerrar la sesión, etc.

Logré hacer aparecer este pie de página en todas las páginas requeridas con la ayuda de las etiquetas Incluir y Fusionar. El problema radica en definir en los oyentes clic para todos los botones. Aunque puedo definir a los oyentes en cada actividad asociada con las pantallas que incluyen el diseño del pie de página, creo que esto se vuelve terriblemente tedioso cuando aumenta el número de pantallas.

Mi pregunta es la siguiente: ¿Puedo definir un clic de botón oyente que funcionará a través de la aplicación, que se puede acceder desde cualquier pantalla con el uso de la android: onClick atributo del botón?

Es decir, me gustaría definir el botón detector de clics una vez, en una clase separada, dicen FooterClickListeners, y simplemente nombrar esa clase como la clase de escucha para los clics de botón en el pie de página. La idea es crear un único punto de acceso para el código del oyente, de modo que todos y cada uno de los cambios a dichos oyentes se reflejen en toda la aplicación.

Respuesta

16

Tuve el mismo problema con un menú que utilicé en varios diseños. Resolví el problema inflando el archivo xml de diseño en una clase que extendía RelativeLayout donde luego definí onClickListener. Después incluí la clase en cada diseño que requiere el menú. El código se veía así:

menu.xml

<?xml version="1.0" encoding="utf-8"?> 

<merge xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <ImageButton android:id="@+id/map_view" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:src="@drawable/button_menu_map_view" 
     android:background="@null" 
     android:scaleType="fitCenter" 
     android:layout_height="@dimen/icon_size" 
     android:layout_width="@dimen/icon_size"> 
    </ImageButton> 

    <ImageButton android:id="@+id/live_view" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:src="@drawable/button_menu_live_view" 
     android:background="@null" 
     android:scaleType="fitCenter" 
     android:layout_height="@dimen/icon_size" 
     android:layout_width="@dimen/icon_size"> 
    </ImageButton> 

    <ImageButton android:id="@+id/screenshot" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentRight="true" 
     android:src="@drawable/button_menu_screenshot" 
     android:background="@null" 
     android:scaleType="fitCenter" 
     android:layout_height="@dimen/icon_size" 
     android:layout_width="@dimen/icon_size"> 
    </ImageButton> 

</merge> 

MenuView.java

public class MenuView extends RelativeLayout { 

    private LayoutInflater inflater; 

    public MenuView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.menu, this, true); 

     ((ImageButton)this.findViewById(R.id.screenshot)).setOnClickListener(screenshotOnClickListener);   
     ((ImageButton)this.findViewById(R.id.live_view)).setOnClickListener(liveViewOnClickListener);  
     ((ImageButton)this.findViewById(R.id.map_view)).setOnClickListener(mapViewOnClickListener); 
    } 

    private OnClickListener screenshotOnClickListener = new OnClickListener() { 
     public void onClick(View v) { 
      getContext().startActivity(new Intent(getContext(), ScreenshotActivity.class)); 
     } 
    }; 

    private OnClickListener liveViewOnClickListener = new OnClickListener() { 
     public void onClick(View v) { 
      getContext().startActivity(new Intent(getContext(), LiveViewActivity.class)); 
     } 
    }; 

    private OnClickListener mapViewOnClickListener = new OnClickListener() { 
     public void onClick(View v) { 
      getContext().startActivity(new Intent(getContext(), MapViewActivity.class)); 
     } 
    }; 
} 

diseño.xml

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

    <SurfaceView android:id="@+id/surface" 
     android:layout_width="fill_parent" 
     android:layout_weight="1" 
     android:layout_height="fill_parent"> 

    </SurfaceView> 

    <!-- some more tags... --> 

    <com.example.inflating.MenuView 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" /> 

</RelativeLayout> 

con la etiqueta <com.example.inflating.MenuView />, que ahora son capaces de volver a utilizar la distribución de su selfwritten (incl OnClickListener) en otros diseños.

+0

Gracias billy el talentoso :) ¡Funciona! –

+0

Muchas gracias. ¡¡¡Esto funciona para mi!!! – AD14

+1

Buena solución, pero un poco largo. Si está buscando una solución simple, eche un vistazo a http://stackoverflow.com/a/16870468/1055241 – gprathour

0

La solución que usted describe es imposible, lo siento. Pero puede tener actividad de padres común para todas sus actividades que usan el pie de página. En la actividad, solo proporcione métodos de control para los botones del pie de página, y luego simplemente herede cada vez que necesite manejar las acciones del pie de página.

+0

Gracias por la respuesta rápida. Sí, había pensado en la misma solución que sugieres, pero esperaba encontrar lo que describí. Supongo que tendré que elegir entre repetir código y heredar. ¡Gracias de nuevo! –

+0

¿Existe alguna razón por la que no pueda implementar esto como una pestaña? – Falmarri

+0

Hola, Falmarri, la pestaña parece tener un problema y bloquea la aplicación, así que tuve que recurrir a esta forma. –

3

Esto es algo que se está agregando a roboguice en el futuro cercano. Le permitirá crear clases de controlador para cosas como la barra de título y los pies de página y hacer que los eventos estén autoconectados para usted.

Pago http://code.google.com/r/adamtybor-roboguice/ para la espiga inicial.

Básicamente si está utilizando roboguice puede definir un componente para pie de página e simplemente inyectar ese componente de pie de página en cada actividad.

Lamentablemente, usted todavía tiene que agregar el controlador a cada actividad, al igual que lo hizo con el diseño de inclusión, pero la buena noticia es que todo se conecta y toda su lógica se queda en una sola clase.

A continuación se muestra un pseudo código de algún uso de ejemplo.

public class FooterController { 
    @InjectView(R.id.footer_button) Button button; 

    @Inject Activity context; 

    @ContextObserver 
    public void onViewsInjected() { 
    button.setOnClickListener(new OnClickListener() { 
     void onClick() { 
     Toast.makeToast(context, "My button was clicked", Toast.DURATION_SHORT).show(); 
     } 
    }); 
    } 
} 

public class MyActivity1 extends RoboActivity { 
    @Inject FooterController footer; 
} 

public class MyActivity2 extends RoboActivity { 
    @Inject FooterController footer; 
} 
+0

parece dulce! ¡Gracias! –

Cuestiones relacionadas