2010-11-08 4 views
20

Je viens à vous à genoux, la question à la main. Je suis relativement nouveau à Android, alors pardonnez toutes les choses sacrilèges que je pourrais dire.Bouton Onclick Listener dans les dispositions incluses

Intro: J'ai plusieurs dispositions dans l'application, qui doivent tous inclure un pied de page commun. Ce pied de page comporte des boutons essentiels pour retourner à la page d'accueil, se déconnecter, etc.

J'ai réussi à faire apparaître ce pied de page dans toutes les pages requises à l'aide des balises Inclure et Fusionner. Le problème réside dans la définition sur les écouteurs de clic pour tous les boutons. Bien que je puisse définir les auditeurs dans chaque activité associée à des écrans qui incluent la disposition de pied de page, je trouve que cela devient terriblement fastidieux lorsque le nombre d'écrans augmente.

Ma question est la suivante: Puis-je définir un bouton clic d'écoute qui fonctionne à travers l'application, accessible depuis tout écran avec l'utilisation de l'android: onClick attribut du bouton?

C'est-à-dire, je voudrais définir le bouton clic écoute une fois, dans une classe séparée, disent FooterClickListeners et le nom simplement que la classe comme la classe d'écoute pour les clics de bouton sur le pied de page. L'idée est de créer un point d'accès unique pour le code d'écoute, afin que toutes les modifications apportées aux auditeurs se répercutent dans l'application.

Répondre

16

J'ai eu le même problème avec un menu que j'ai utilisé dans plusieurs mises en page. J'ai résolu le problème en gonflant le fichier xml de mise en page dans une classe d'extension RelativeLayout où j'ai ensuite défini l'onClickListener. Ensuite, j'ai inclus la classe dans chaque mise en page nécessitant le menu. Le code ressemblait à ceci:

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

de mise en page .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> 

avec l'étiquette <com.example.inflating.MenuView />, vous êtes maintenant en mesure de réutiliser votre mise en page de selfwritten (y compris onClickListener) dans d'autres dispositions.

+0

Merci Billy le talentueux :) Ca marche! –

+0

Merci beaucoup. Ça marche pour moi!!! – AD14

+1

Belle solution mais peu longue. Si vous cherchez une solution simple, jetez un oeil à http://stackoverflow.com/a/16870468/1055241 – gprathour

0

La solution que vous décrivez est impossible, désolé. Mais vous pouvez avoir une activité parentale commune pour toutes vos activités qui utilisent le pied de page. Dans l'activité, il vous suffit de fournir des méthodes de gestion pour les boutons de pied de page, puis d'en hériter chaque fois que vous devez gérer les actions de pied de page.

+0

Merci pour la réponse rapide. Oui, j'avais pensé à la même solution que vous suggérez, mais j'espérais trouver ce que j'ai décrit. Je suppose que je vais devoir choisir entre répéter le code et hériter. Merci encore! –

+0

Est-ce une raison pour laquelle vous ne pouvez pas implémenter cela sous forme de tabview? – Falmarri

+0

Salut, Falmarri, tabview semble avoir un problème et bloque l'application, j'ai donc dû recourir à ce formulaire. –

3

Ceci est quelque chose qui est ajouté à roboguice dans le futur proche. Il vous permettra de construire des classes de contrôleurs pour des choses comme les barres de titre et les pieds de page et d'avoir les événements autowired pour vous.

Checkout http://code.google.com/r/adamtybor-roboguice/ pour le pic initial. Fondamentalement, si vous utilisez roboguice, vous pouvez définir un composant pour le pied de page et simplement injecter ce composant dans chaque activité. Malheureusement, vous devez toujours ajouter le contrôleur à chaque activité, comme vous l'avez fait avec la disposition d'inclusion, mais les bonnes nouvelles sont que tout est câblé pour vous et toute votre logique reste dans une seule classe.

Ci-dessous un pseudo code de quelques exemples d'utilisation.

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

semble doux! Merci! –

Questions connexes