EditText maxLines ne fonctionne pas – l’utilisateur peut toujours saisir plus de lignes que l’ensemble

  

L’utilisateur peut saisir plus de 5 lignes en appuyant sur la touche Entrée / Ligne suivante. Comment puis-je limiter la saisie de l’utilisateur à un nombre fixe de lignes avec EditText?

L’atsortingbut maxLines correspond à la hauteur maximale de EditText , il contrôle les limites externes et non les lignes de texte internes.

  

Vous devez juste vous assurer que vous avez l’atsortingbut “inputType” défini. Cela ne fonctionne pas sans cette ligne.

 android:inputType="text" 

Cela ne résout pas le problème général de la limitation à n lignes. Si vous souhaitez limiter votre EditText pour ne prendre qu’une ligne de texte, cela peut être très simple.
Vous pouvez définir cela dans le fichier xml.

 android:singleLine="true" 

ou par programme

 editText.setSingleLine(true); 

@Cedekasem vous avez raison, il n’y a pas de “limiteur de ligne” intégré. Mais je me suis construit un moi, donc si quelqu’un est intéressé le code est ci-dessous. À votre santé.

 et.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // if enter is pressed start calculating if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) { // get EditText text Ssortingng text = ((EditText) v).getText().toSsortingng(); // find how many rows it cointains int editTextRowCount = text.split("\\n").length; // user has input more than limited - lets do something // about that if (editTextRowCount >= 7) { // find the last break int lastBreakIndex = text.lastIndexOf("\n"); // compose new text Ssortingng newText = text.subssortingng(0, lastBreakIndex); // add new text - delete old one and append new one // (append because I want the cursor to be at the end) ((EditText) v).setText(""); ((EditText) v).append(newText); } } return false; } }); 

J’ai fait quelque chose comme tu cherchais. Voici ma classe LimitedEditText .

Caractéristiques:

  • vous pouvez limiter le nombre de lignes dans votre composant LimitedEditText
  • vous pouvez limiter le nombre de caractères dans votre composant LimitedEditText
  • si vous dépassez la limite de caractères ou de lignes quelque part au milieu du texte, le curseur
    ne vous amènera pas à la fin – cela restra où vous étiez.

Je désactive l’auditeur, car chaque appel de la méthode setText() appelle récursivement ces 3 méthodes de rappel au cas où l’utilisateur dépasserait la limite de caractères ou de lignes.

Code:

 import android.content.Context; import android.text.Editable; import android.text.TextWatcher; import android.util.AtsortingbuteSet; import android.util.Log; import android.widget.EditText; import android.widget.Toast; /** * EditText subclass created to enforce limit of the lines number in editable * text field */ public class LimitedEditText extends EditText { /** * Max lines to be present in editable text field */ private int maxLines = 1; /** * Max characters to be present in editable text field */ private int maxCharacters = 50; /** * application context; */ private Context context; public int getMaxCharacters() { return maxCharacters; } public void setMaxCharacters(int maxCharacters) { this.maxCharacters = maxCharacters; } @Override public int getMaxLines() { return maxLines; } @Override public void setMaxLines(int maxLines) { this.maxLines = maxLines; } public LimitedEditText(Context context, AtsortingbuteSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; } public LimitedEditText(Context context, AtsortingbuteSet attrs) { super(context, attrs); this.context = context; } public LimitedEditText(Context context) { super(context); this.context = context; } @Override protected void onFinishInflate() { super.onFinishInflate(); TextWatcher watcher = new TextWatcher() { private Ssortingng text; private int beforeCursorPosition = 0; @Override public void onTextChanged(CharSequence s, int start, int before, int count) { //TODO sth } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { text = s.toSsortingng(); beforeCursorPosition = start; } @Override public void afterTextChanged(Editable s) { /* turning off listener */ removeTextChangedListener(this); /* handling lines limit exceed */ if (LimitedEditText.this.getLineCount() > maxLines) { LimitedEditText.this.setText(text); LimitedEditText.this.setSelection(beforeCursorPosition); } /* handling character limit exceed */ if (s.toSsortingng().length() > maxCharacters) { LimitedEditText.this.setText(text); LimitedEditText.this.setSelection(beforeCursorPosition); Toast.makeText(context, "text too long", Toast.LENGTH_SHORT) .show(); } /* turning on listener */ addTextChangedListener(this); } }; this.addTextChangedListener(watcher); } } 

J’ai fait une solution plus simple pour cela: D

 // set listeners txtSpecialRequests.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { lastSpecialRequestsCursorPosition = txtSpecialRequests.getSelectionStart(); } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { txtSpecialRequests.removeTextChangedListener(this); if (txtSpecialRequests.getLineCount() > 3) { txtSpecialRequests.setText(specialRequests); txtSpecialRequests.setSelection(lastSpecialRequestsCursorPosition); } else specialRequests = txtSpecialRequests.getText().toSsortingng(); txtSpecialRequests.addTextChangedListener(this); } }); 

Vous pouvez modifier la valeur 3 dans txtSpecialRequests.getLineCount() > 3 selon vos besoins.

Voici un InputFilter qui limite les lignes autorisées dans EditText:

 /** * Filter for controlling maximum new lines in EditText. */ public class MaxLinesInputFilter implements InputFilter { private final int mMax; public MaxLinesInputFilter(int max) { mMax = max; } public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { int newLinesToBeAdded = countOccurrences(source.toSsortingng(), '\n'); int newLinesBefore = countOccurrences(dest.toSsortingng(), '\n'); if (newLinesBefore >= mMax - 1 && newLinesToBeAdded > 0) { // filter return ""; } // do nothing return null; } /** * @return the maximum lines enforced by this input filter */ public int getMax() { return mMax; } /** * Counts the number occurrences of the given char. * * @param ssortingng the ssortingng * @param charAppearance the char * @return number of occurrences of the char */ public static int countOccurrences(Ssortingng ssortingng, char charAppearance) { int count = 0; for (int i = 0; i < string.length(); i++) { if (string.charAt(i) == charAppearance) { count++; } } return count; } } 

Pour l'append à EditText:

 editText.setFilters(new InputFilter[]{new MaxLinesInputFilter(2)}); 

C’est ce que j’ai utilisé dans mon projet:

 editText.addTextChangedListener(new TextWatcher() { private Ssortingng text; public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { text = arg0.toSsortingng(); } public void afterTextChanged(Editable arg0) { int lineCount = editText.getLineCount(); if(lineCount > numberOfLines){ editText.setText(text); } } }); editText.setOnKeyListener(new View.OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { // if enter is pressed start calculating if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN){ int editTextLineCount = ((EditText)v).getLineCount(); if (editTextLineCount >= numberOfLines) return true; } return false; } }); 

Et cela a fonctionné dans tous les scénarios

Une autre façon de limiter votre EditText à une ligne est la suivante:

 editText2.setTransformationMethod(new SingleLineTransformationMethod()); 

Notez qu’après avoir appliqué cette méthode de transformation, la touche Entrée crée des espaces lorsque vous appuyez dessus. Cela satisfait toujours la question de TS.

getLineCount () est une option; Si vous voulez des valeurs non nulles, assurez-vous que votre vue est mesurée. Pour le clavier logiciel, onKeyListener ne fonctionnera pas, vous devez donc append addTextChangedListener () qui suivra les modifications du texte au fur et à mesure de votre saisie. Dès que vous obtenez suffisamment de lignes dans ses rappels, faites ce que vous voulez limiter: supprimez les caractères avec getText (), setText () ou quelque chose de plus sophistiqué. Vous pouvez même limiter le nombre de caractères à l’aide d’un filtre.

Une autre option consiste à surveiller la taille du texte avec getLineBounds (). Cela va interagir avec la gravité du texte / paddign alors soyez prudent.

Pour limiter le nombre de caractères, nous pouvons simplement utiliser la propriété maxLength d’EditText, car cela ne permettra pas à l’utilisateur d’entrer plus de caractères.

Solution la plus simple:

 android:maxLines="3" 

  @Override public void afterTextChanged(Editable editable) { // limit to 3 lines if (editText.getLayout().getLineCount() > 3) editText.getText().delete(editText.getText().length() - 1, editText.getText().length()); } 

C’est une approche. Peut aider quelqu’un.

 android:lines="1" android:maxLines="1" android:inputType="text 

Essayez d’utiliser la combinaison d’atsortingbuts suivante de EditText dans le fichier xml:

android:singleLine="true"
android:maxLength="22"