Pregunta

Me viene a usted de rodillas, pregunta en la mano. Soy relativamente nuevo en Android, por lo que el perdón cualquier cosas sacrílegas podría decir.

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

Me las arreglé para conseguir este pie de página para aparecer en todas las páginas necesarias con la ayuda de la incluir y etiquetas de combinación. La cuestión radica en la definición de los oyentes clic para todos los botones. Aunque puedo definir los oyentes en toda actividad asociada con las pantallas que incluyen el diseño de pie de página, me parece que esto se convierte en terriblemente tediosa cuando el número de pantallas aumenta.

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 etiqueta android: onClick atributo del botón?

Es decir, me gustaría definir el botón detector de clics una vez, en una clase separada, digamos FooterClickListeners , y simplemente el nombre de esa clase como la clase de escucha para los clics de botón en el pie de página . La idea es hacer un único punto de acceso para el código de escucha, de modo que cualquier y todos los cambios a dichos oyentes reflejarán en toda la aplicación.

¿Fue útil?

Solución

Yo tenía el mismo problema con un menú que he utilizado en varios diseños. He resuelto el problema mediante el inflado del archivo XML en una clase de diseño se extiende RelativeLayout donde define entonces la OnClickListener. A continuación he incluido la clase en cada diseño que requiere el menú. El código era el siguiente:

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 etiqueta <com.example.inflating.MenuView />, que ahora son capaces de reutilizar su selfwritten Layout (incl OnClickListener) en otros diseños.

Otros consejos

Esto es algo que se van añadiendo a roboguice en el cercano futuro. Se le permitirá a clases de controlador de construcción para cosas como la barra de título de y pies de página y tienen los eventos autowired para usted.

http://code.google.com/r/adamtybor-roboguice/ para el pico inicial.

Básicamente, si usted está usando roboguice puede definir un componente de pie de página y simplemente inyectar ese componente pie de página en cada actividad.

Desafortunadamente todavía tiene que agregar el controlador para cada actividad, al igual que lo hizo con el diseño incluyen, pero la buena noticia es que todo se cablea de usted y todos sus estancias lógicas en una sola clase.

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

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;
}

La solución que usted describe es imposible, lo siento. Pero se puede tener actividad padre común para todas sus actividades que utilizan el pie de página. En la actividad acaba de proporcionar métodos de controlador para los botones de pie de página, a continuación, sólo heredar de ella cada vez que se necesita para manejar las acciones de pie de página.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top