2 votes

Comment augmenter le rembourrage d'un bouton d'extension d'une vue personnalisée sans mettre à l'échelle les objets à dessiner ?

Je comprends qu'il est plus facile de définir le remplissage sans modifier la taille du dessin sur ImageButton, mais je suis en train d'étendre Button pour ma vue personnalisée car j'ai besoin de remplacer la méthode OnTextChanged (puisque Button étend TextView).

J'ai également essayé de définir le rembourrage par programme, sans succès.

Une partie de mon xml ci-dessous :

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?attr/backgroundColor">

    <TableRow
        android:layout_weight="1"
        android:gravity="center">

        <org.linphone.views.Digit
            android:id="@+id/Digit1"
            style="@style/DialerDigit"
            android:background="@drawable/ws_numpad_1"
            android:soundEffectsEnabled="true"
            android:layout_weight="1"
            android:text="1"/>

        <org.linphone.views.Digit
            android:id="@+id/Digit2"
            style="@style/DialerDigit"
            android:background="@drawable/ic_num2_group"
            android:soundEffectsEnabled="true"
            android:text="2"
            android:layout_weight="1" />

        <org.linphone.views.Digit
            android:id="@+id/Digit3"
            style="@style/DialerDigit"
            android:background="@drawable/ic_num3_group"
            android:soundEffectsEnabled="true"
            android:text="3"
            android:layout_weight="1" />

    </TableRow>

Actuellement, les boutons s'étendent pour correspondre au parent, mais les éléments à dessiner s'étendent également. Mon objectif est d'obtenir un pavé numérique similaire à celui de la version native d'Android (c'est-à-dire qu'il n'y a pas d'espace entre les chiffres et que les chiffres du pavé numérique ne se déforment pas en fonction de la taille de l'écran).

Edit 1 (image du clavier ajoutée) :

This is the current view of my dialpad

Edition 2 (implémentation de l'écoute du clavier) :

@Override
    protected void onTextChanged(CharSequence text, int start, int before, int after) {
        super.onTextChanged(text, start, before, after);

        if (text == null || text.length() < 1) {
            return;
        }

        DialKeyListener lListener = new DialKeyListener();
        setOnClickListener(lListener);
        setOnTouchListener(lListener);

        // Assign button long clicks here
        if ("0".equals(text.toString())) { // This was 0+, but they were separated, hence
            // changed to 0 only
            setOnLongClickListener(lListener);
        }

        if ("1".equals(text.toString())) {
            setOnLongClickListener(lListener);
        }
    }

private class DialKeyListener implements OnClickListener, OnTouchListener, OnLongClickListener {
        final char mKeyCode;
        boolean mIsDtmfStarted;

        DialKeyListener() {
            mKeyCode = Digit.this.getText().subSequence(0, 1).charAt(0);
        }

        private boolean linphoneServiceReady() {
            if (!LinphoneContext.isReady()) {
                Log.e("[Numpad] Service is not ready while pressing digit");
                return false;
            }
            return true;
        }
   ...
}

3voto

Itay Feldman Points 510

Étant donné que vous travaillez avec une vue personnalisée de type bouton et que vous définissez un arrière-plan, la taille du bouton correspondra à la taille du dessin que vous avez placé en arrière-plan.

Maintenant, vous pouvez simplement changer votre vue personnalisée pour étendre ImageButton et non Button et vous serez en mesure de le faire fonctionner comme ceci -.

   <TableRow
        android:layout_weight="1"
        android:gravity="center">

        <ImageButton
            android:id="@+id/Digit1"
            style="@style/DialerDigit"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:src="@drawable/ic_num1_group"
            android:tag="1" />

        <ImageButton
            android:id="@+id/Digit2"
            style="@style/DialerDigit"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:soundEffectsEnabled="true"
            android:src="@drawable/ic_num2_group"
            android:tag="2" />

        <ImageButton
            android:id="@+id/Digit3"
            style="@style/DialerDigit"
            android:layout_weight="1"
            android:background="@android:color/transparent"
            android:soundEffectsEnabled="true"
            android:src="@drawable/ic_num3_group"
            android:tag="3" />

    </TableRow>

Si vous souhaitez conserver votre implémentation après avoir changé pour ImageButton, la seule différence sera -

Au lieu d'initier les listeners à l'intérieur du callback onTextChange, vous pouvez le faire dans une méthode initListeners() de l'appelé une fois que la vue est créée et ajoute elle-même les listeners dont elle a besoin - -.

private void initListeners() {
    DialKeyListener lListener = new DialKeyListener();
    setOnClickListener(lListener);
    setOnTouchListener(lListener);
    setOnLongClickListener(lListener);

    // Assign button long clicks here
    if (Digit.this.getTag().toString().equals("0")) { 
        setOnLongClickListener(lListener);
    }

    if (Digit.this.getTag().toString().equals("1")) {
        setOnLongClickListener(lListener);
    }
}

Et au lieu d'obtenir le numéro du bouton cliqué à partir du texte du bouton que vous avez placé dans le xml, vous pouvez utiliser les balises exactement de la même manière.

J'ai ajouté des balises à l'exemple xml ci-dessus et une fois que vous avez la vue dans le callback onClick, vous pouvez simplement utiliser getTag() pour voir quel est le numéro.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X