web-dev-qa-db-fra.com

Bouton Onclick Listener dans les dispositions incluses

Je viens à vous sur un genou plié, question à la main. Je suis relativement nouveau sur Android, alors pardonnez toutes choses sacrilèges que je pourrais dire. 

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

J'ai réussi à faire en sorte que ce pied de page apparaisse dans toutes les pages requises à l'aide des balises Include et Merge. Le problème consiste à définir des écouteurs de clic pour tous les boutons. Bien que je puisse définir les auditeurs dans chaque activité associée aux écrans qui incluent la disposition du 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 écouteur de clic sur le bouton qui fonctionnera dans l’application, accessible depuis n’importe quel écran grâce à l’utilisation de Android: onClick du attribut du bouton? 

C'est-à-dire que je voudrais définir l'écouteur de clic sur le bouton une fois, dans une classe distincte, par exemple FooterClickListeners , et simplement nommer cette classe comme classe d'écoute pour tout clic sur le pied de page. L'idée est de créer un point d'accès unique pour le code d'auditeur, afin que toutes les modifications apportées aux auditeurs soient prises en compte dans l'application.

20
Sreedevi J

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 étendue de RelativeLayout où j'ai ensuite défini le onClickListener. Ensuite, j'ai inclus la classe dans chaque mise en page requérant 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));
        }
    };  
}

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>

avec la balise <com.example.inflating.MenuView />, vous pouvez maintenant réutiliser votre mise en page auto-écrite (y compris onClickListener) dans d'autres mises en page.

17
billythetalented

C'est quelque chose qui va s'ajouter au roboguice dans un futur proche. Cela vous permettra de construire des classes de contrôleurs pour des choses comme les barres de titre et les pieds de page et de faire en sorte que les événements soient automatiquement câblés pour vous.

Checkout http://code.google.com/r/adamtybor-roboguice/ pour le pic initial.

En gros, si vous utilisez roboguice, vous pouvez définir un composant pour le pied de page et simplement injecter ce composant de pied de page dans chaque activité.

Malheureusement, vous devez toujours ajouter le contrôleur à chaque activité, comme vous l'avez fait pour la disposition include, mais la bonne nouvelle est que tout est câblé pour vous et que toute votre logique reste dans une seule classe.

Vous trouverez ci-dessous un pseudo-code présentant un exemple 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;
}
3
abombss

La solution que vous décrivez est impossible, désolée. Mais vous pouvez avoir une activité parent commune pour toutes vos activités utilisant le pied de page. Dans l'activité, fournissez uniquement des méthodes de gestion pour les boutons de pied de page, puis héritez-en chaque fois que vous devez gérer les actions de pied de page.

0
Konstantin Burov