Différence entre un ImageView et un ImageButton cliquables


149

Je me demande simplement s'il y a une différence significative entre un ImageViewqui est défini pour être cliquable, par rapport à un ImageButton?

Y a-t-il une raison d'utiliser l'un sur l'autre? Y a-t-il une restriction sur le tirage pour un ImageButtonqui laisse ImageViewcomme seule option possible?

Est-ce que je peut - être perdre toutes les fonctionnalités d'un bouton si j'opte pour un cliquable ImageViewplus ImageButton?

Réponses:


158

Il n'y a pas de différences, sauf le style par défaut. ImageButtona un arrière-plan non nul par défaut.

EDIT : De plus, la ImageButton.onSetAlpha()méthode renvoie toujours false, scaleTypeest définie sur centeret elle est toujours gonflée comme focalisable.

Voici le ImageButtonstyle par défaut:

 <style name="Widget.ImageButton">
     <item name="android:focusable">true</item>
     <item name="android:clickable">true</item>
     <item name="android:scaleType">center</item>
     <item name="android:background">@android:drawable/btn_default</item>
 </style>

1
Merci pour votre réponse. Vous m'avez donné plus que ce que j'ai remarqué en parcourant moi-même le code. Je suppose qu'en fin de compte, la sélection entre les 2 dépendra de la quantité de propriétés par défaut que vous pouvez utiliser sans aucune personnalisation.
yjw

Vous êtes les bienvenus! Oui, il n'y a pas beaucoup de différence, donc le choix est entre bouton et non bouton, je pense.
Michael

20
En fait, d'après mon expérience, une autre différence entre les deux est que si vous voulez mettre un bouton cliquable dans une cellule ListView tout en maintenant la cellule elle-même cliquable, vous êtes bien mieux avec un Imageview. EditTexts et ImageButtons semblent consommer l'événement tactile alors que TextViews et ImageViews ne le font pas.
Ernir Erlingsson

J'avais utilisé ImageView cliquable mais selon la nouvelle exigence, je dois les changer en ImageButton mais l'image utilisée est gonflée. Comment éviter l'inflation d'image dans ImageButton?
codeRider

@codeRider Je ne suis pas sûr de comprendre ce que vous voulez dire. Si son positionnement diffère de ce qu'il était, ImageViewvous pouvez le spécifier scaleTypeexplicitement.
Michael

24

ImageButton est hérité de ImageView

public class ImageButton extends ImageView {
public ImageButton(Context context) {
    this(context, null);
}

public ImageButton(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.imageButtonStyle);
}

public ImageButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    setFocusable(true);
}

@Override
protected boolean onSetAlpha(int alpha) {
    return false;
}

@Override
public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
    super.onInitializeAccessibilityEvent(event);
    event.setClassName(ImageButton.class.getName());
}

@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
    super.onInitializeAccessibilityNodeInfo(info);
    info.setClassName(ImageButton.class.getName());
}

comme @Micheal décrit, je viens d'ajouter des détails à sa réponse


Comment cela répond-il aux différentes questions du PO?
flawyte

@flawyte ce n'est pas le cas - il étend simplement la réponse acceptée en indiquant comment ImageButtondérive ImageView.
Scre il y a

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.