programacion - manual de android en pdf
Botón OnClick Listener en diseños incluidos (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.
Consulte http://code.google.com/r/adamtybor-roboguice/ para conocer el pico inicial.
Básicamente, si está utilizando roboguice, puede definir un componente para pie de página e inyectar ese componente de pie de página en cada actividad.
Lamentablemente, 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 cablea para usted 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;
}
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.
Introducción: Tengo varios diseños en la aplicación, que todos deben incluir un pie de página común. Este pie de página tiene algunos botones esenciales para volver 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 oyente que haga clic en el oyente que funcionará en toda la aplicación, al que se puede acceder desde cualquier pantalla con el uso del atributo android: onClick del botón?
Es decir, me gustaría definir el botón hacer clic en el oyente una vez, en una clase separada, decir FooterClickListeners , y simplemente nombrar esa clase como clase de escucha para cualquier clic 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.
La solución que describes 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.
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));
}
};
}
layout.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 <com.example.inflating.MenuView />
, ahora puede reutilizar su Diseño auto-escrito (incluido enClickListener) en otros diseños.