2010-11-08 11 views
20

Vengo da voi in ginocchio, domanda in mano. Sono relativamente nuovo ad Android, quindi perdonare qualsiasi cosa sacrilega che potrei dire.Pulsante Ascoltatore Onclick nei formati inclusi

Intro: Ho diversi layout nell'app, che devono includere un piè di pagina comune. Questo footer presenta alcuni pulsanti essenziali per tornare alla home page, disconnettersi, ecc.

Sono riuscito a visualizzare questo piè di pagina in tutte le pagine richieste con l'aiuto dei tag Includi e Unisci. Il problema sta nella definizione degli ascoltatori di clic per tutti i pulsanti. Sebbene sia possibile definire gli ascoltatori in ogni attività associata alle schermate che includono il layout del footer, trovo che ciò diventi terribilmente noioso quando il numero di schermate aumenta.

mia domanda è questa: posso definire un clic del pulsante ascoltatore che funzionerà attraverso l'applicazione, cui si può accedere da qualsiasi schermata con l'uso del Android: onClick attributo del pulsante?

Vale a dire, vorrei definire il pulsante di scatto ascoltatore, una volta, in una classe separata, dicono FooterClickListeners, e semplicemente nome che classe come la classe listener per ogni clic sul pulsante sul piè di pagina. L'idea è di creare un unico punto di accesso per il codice listener, in modo che tutte le modifiche a detti listener riflettano l'intera applicazione.

risposta

16

Ho avuto lo stesso problema con un menu che ho utilizzato in diversi layout. Ho risolto il problema gonfiando il file di layout xml in una classe che estende RelativeLayout dove ho quindi definito onClickListener. Successivamente ho incluso la lezione in ogni layout che richiede il menu. Il codice si presentava così:

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 il tag <com.example.inflating.MenuView />, si è ora in grado di riutilizzare il layout selfwritten (incl onClickListener) in altri layout.

+0

Grazie billy il talentuoso :) Funziona! –

+0

Grazie mille. Per me funziona!!! – AD14

+1

Bella soluzione ma un po 'lunga. Se stai cercando una soluzione semplice dai un'occhiata a http://stackoverflow.com/a/16870468/1055241 – gprathour

0

La soluzione che descrivi è impossibile, mi dispiace. Ma puoi avere un'attività genitori comune per tutte le tue attività che utilizzano il piè di pagina. Nell'attività fornisci semplicemente i metodi del gestore per i pulsanti del tuo footer, quindi ereditali ogni volta che devi gestire le azioni del footer.

+0

Grazie per la rapida risposta. Sì, avevo pensato alla stessa soluzione che suggerisci, ma speravo di trovare ciò che ho descritto. Immagino che dovrò scegliere tra il codice ripetuto e l'ereditare. Grazie ancora! –

+0

È qui un motivo per cui non è possibile implementarlo come tabview? – Falmarri

+0

Ciao, Falmarri, tabview sembra avere un problema e blocca l'applicazione, quindi ho dovuto ricorrere a questo modulo. –

3

Questo è qualcosa che viene aggiunto a roboguice nel prossimo futuro. Ti consentirà di creare classi di controller per elementi come la barra del titolo e i piè di pagina e avere gli eventi creati automaticamente per te.

Acquista http://code.google.com/r/adamtybor-roboguice/ per il picco iniziale.

In sostanza se si utilizza roboguice è possibile definire un componente per il piè di pagina e iniettare semplicemente il componente footer in ogni attività.

Purtroppo devi ancora aggiungere il controller ad ogni attività, proprio come hai fatto con il layout di inclusione, ma la buona notizia è che tutto viene cablato per te e tutta la tua logica rimane in una singola classe.

Di seguito è riportato qualche pseudo-codice di alcuni esempi di utilizzo.

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

sembra dolce! Grazie! –

Problemi correlati