81 votes

Texte multiligne EditText avec le libellé Action SoftInput Done sur 2.3

Est-il un moyen d'avoir un Multi-Ligne, EditText présenter et utiliser l'IME Action de l'Étiquette "Fait" sur Android 2.3?

Dans Android 2.2, ce n'est pas un problème, le bouton enter montre l'IME Action de l'Étiquette "Fait" (android:imeActionLabel="actionDone"), et renvoie le Soft d'Entrée lorsque l'utilisateur clique dessus.

Lors de la configuration d'un EditText pour le multi-ligne, Android 2.3 supprime la capacité de montrer le "Fait" de l'action pour le Soft d'Entrée du clavier.

J'ai réussi à modifier le comportement de la Saisie logicielle enter à l'aide d'un KeyListener, cependant le bouton enter ressemble encore à la touche entrée.


Voici la déclaration de l' EditText

<EditText
        android:id="@+id/Comment"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="0dp"
        android:lines="3"
        android:maxLines="3"
        android:minLines="3"
        android:maxLength="60"
        android:scrollHorizontally="false"
        android:hint="hint"
        android:gravity="top|left"
        android:textColor="#888"
        android:textSize="14dp"
        />
<!-- android:inputType="text" will kill the multiline on 2.3! -->
<!-- android:imeOptions="actionDone" switches to a "t9" like soft input -->

Lorsque je vérifie l' inputType de la valeur après le chargement de réglage de l'affichage du contenu de l'activité, il apparaît que:

inputType = 0x20001

Qui est:

  • class = TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_NORMAL
  • flags = InputType.TYPE_TEXT_FLAG_MULTI_LINE

162voto

ohhorob Points 6994

Eh bien, après re-lecture de l' TextView et EditorInfo docs, il est devenu clair que la plate-forme va obliger IME_FLAG_NO_ENTER_ACTION de texte multi-ligne vues.

Notez que TextView automatiquement définir cet indicateur pour vous sur multi-ligne texte de vues.

Ma solution est de la sous-classe EditText et ajuster l'IME options après avoir laissé la plate-forme de configurer:

@Override
public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
    InputConnection connection = super.onCreateInputConnection(outAttrs);
    int imeActions = outAttrs.imeOptions&EditorInfo.IME_MASK_ACTION;
    if ((imeActions&EditorInfo.IME_ACTION_DONE) != 0) {
        // clear the existing action
        outAttrs.imeOptions ^= imeActions;
        // set the DONE action
        outAttrs.imeOptions |= EditorInfo.IME_ACTION_DONE;
    }
    if ((outAttrs.imeOptions&EditorInfo.IME_FLAG_NO_ENTER_ACTION) != 0) {
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
    }
    return connection;
}

Ci-dessus, je suis forçant IME_ACTION_DONE trop, même si cela peut être réalisé grâce à fastidieux de mise en page de configuration.

103voto

Timmmm Points 9909

La réponse d'Ohhorob est fondamentalement correcte, mais son code est vraiment redondant! C'est fondamentalement l'équivalent de cette version beaucoup plus simple (code complet pour les lecteurs paresseux):

 package com.example.views;

import android.content.Context;
import android.util.AttributeSet;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.widget.EditText;

// An EditText that lets you use actions ("Done", "Go", etc.) on multi-line edits.
public class ActionEditText extends EditText
{
    public ActionEditText(Context context)
    {
        super(context);
    }

    public ActionEditText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ActionEditText(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }

    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs)
    {
        InputConnection conn = super.onCreateInputConnection(outAttrs);
        outAttrs.imeOptions &= ~EditorInfo.IME_FLAG_NO_ENTER_ACTION;
        return conn;
    }
}
 

Notez que certaines options inputType telles que textShortMessage font que cela ne fonctionne pas! Je vous suggère de commencer par inputType="text" . Voici comment vous pourriez l'utiliser dans votre XML.

 <com.example.views.ActionEditText
    android:id=...
    android:layout_stuff=...
    android:imeOptions="actionDone"
    android:inputType="textAutoCorrect|textCapSentences|textMultiLine"
    android:maxLines="3" />
 

55voto

Futzilogik Points 461

Une autre solution pour sous-classer la classe EditText consiste à configurer votre instance EditText avec ceci:

 editText.setHorizontallyScrolling(false);
editText.setMaxLines(Integer.MAX_VALUE);
 

Au moins, cela fonctionne pour moi sur Android 4.0. Il configure l'instance EditText de sorte que l'utilisateur modifie une chaîne à une seule ligne affichée avec un ajustement progressif sur plusieurs lignes, même si une action IME est définie.

1voto

Mullins Points 901

Apparemment, la réponse à la question initiale est Oui, mais je pense que l’équipe Android essaie de faire réfléchir un peu les développeurs à la manière dont ils utilisent le multi-ligne EditText. Ils veulent que la touche Entrée ajoute des nouvelles lignes et s'attendent probablement à ce que vous fournissiez un bouton ou un autre moyen de saisie pour déclencher l'événement que vous avez terminé de modifier.

J'ai le même problème et ma solution évidente était simplement d'ajouter un bouton Terminé et de laisser le bouton Entrée ajouter les nouvelles lignes.

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