Implémenter onClick uniquement pour un dessinateur composé TextView

j'ai besoin d'avoir un texte avec un drawable sur la gauche et je veux exécuter du code lorsque l'utilisateur clique sur/touche l'image (uniquement l'image, pas le texte), j'ai donc utilisé un LinearLayout avec un TextView et un ImageView qui est cliquable et lance un événement onClick. L'analyseur XML me suggère de remplacer ceci par un TextView par un compound drawable , qui dessinerait la même chose avec beaucoup moins de lignes de XML .. Ma question Est "puis-je spécifier que je veux gérer un événement onClick seulement sur le drawable du TextView et non sur le TextView lui-même? J'ai vu quelques solutions qui impliquent l'écriture de votre propre extension de TextView , mais je suis seulement intéressé à être en mesure de le faire dans la ressource de layout, si possible, sinon je vais garder le après XML code:

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="bottom"
            android:paddingTop="10dp"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:text="@string/home_feedback_title"
            android:textColor="@android:color/primary_text_dark"
            android:textStyle="bold" 
            android:paddingBottom="4dp"/>


        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/action_feedback" 
            android:clickable="true"
            android:onClick="onClickFeedback"
            android:contentDescription="@string/action_feedback_description"/>
</LinearLayout>
25
demandé sur Gianni Costanzi 2012-05-19 18:47:20

3 réponses

vous pouvez aller dans les deux sens. L'utilisation du dessinable composé est plus rapide cependant parce qu'il a été prévu d'être une optimisation. Il utilise moins de ram parce que vous réduisez 3 vues en 1 et il est plus rapide mise en page parce que vous perdez 1 profondeur.

si j'étais vous, j'envisagerais de revenir en arrière pour voir si le texte et l'image interceptant le toucher pour faire quelque chose est peut-être une bonne chose. En général, le fait d'avoir une plus grande région tactile rend la presse plus facile. Certains utilisateurs peuvent être enclin à toucher le texte au lieu de l'image.

enfin, si vous optez pour cette voie de fusion des 2, vous pourriez envisager d'utiliser un Button au lieu d'un TextView . Vous pouvez styliser le bouton pour ne pas avoir le rectangle autour de lui. Ils appellent ça un format bouton. C'est agréable parce que vous obtenez des commentaires visuels que vous avez cliqué sur un élément donnant lieu à une action où comme un ImageView ou TextView ne sont normalement pas donnant lieu à une action.

Comment faire Créer des boutons Sans Frontières dans Android

7
répondu Jeremy Edwards 2017-05-23 11:46:10

C'est très simple. Disons que vous avez un drawable sur le côté gauche de votre TextView 'txtview'. Les suivants feront l'affaire.

TextView txtview = (TextView) findViewById(R.id.txtview);
txtview.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_UP) {
            if(event.getRawX() <= txtview.getTotalPaddingLeft()) {
                // your action for drawable click event

             return true;
            }
        }
        return true;
    }
});

si vous voulez pour droit tirable modifier l'instruction if en:

if(event.getRawX() >= txtview.getRight() - txtview.getTotalPaddingRight())

de même, vous pouvez le faire pour tous les tirables composés.

txtview.getTotalPaddingTop();
txtview.getTotalPaddingBottom();

cet appel de méthode renvoie tout le rembourrage de ce côté, y compris les tirables. Vous pouvez l'utiliser même pour TextView, Button etc.

, Cliquez sur ici pour la référence à partir de l'android developer site.

35
répondu Vishnuvathsan 2015-03-23 15:23:44

la réponse de @Vishnuvathsan est presque parfaite, mais getRaw() renvoie une position x absolue du point de contact. Si le textview n'est pas situé sur le bord gauche de la vue, vous devez comparer avec la position absolue du textview en utilisant getLocationOnScreen . Le Code ci-dessous est un exemple pour vérifier à la fois le robinet étirable à gauche et le robinet étirable à droite.

textView.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_UP) {
            int[] textLocation = new int[2];
            textView.getLocationOnScreen(textLocation);

            if(event.getRawX() <=  textLocation[0] + textView.getTotalPaddingLeft()) {

                //Left drawable was tapped.

                return true;
            }`


            if(event.getRawX() >= textLocation[0] + textView.getWidth() - textView.getTotalPaddingRight()){

                //Right drawable was tapped.

                return true;
            }
        }
        return true;
    }
});
4
répondu Takamitsu Mizutori 2017-11-27 03:32:14