Osservatore di text in Android

Ho un programma in cui ho un editText. Voglio implementare TextWatcher per riflettere le modifiche nel contenuto totale. Vorrei mostrare la window di dialogo di avviso quando la casella di modifica raggiunge il limite max del carattere 10. Quando implemento il watcher di text funziona ma mostra due caselle di avviso quando raggiunge 10 caratteri. ecco il mio codice

private TextWatcher mTextEditorWatcher = new TextWatcher() { public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { // This sets a textview to the current length // mTextView.setText(String.valueOf(s.length())); } public void afterTextChanged(Editable s) { if (s.length() == 10) { messageBody.setImeOptions(EditorInfo.IME_ACTION_DONE); AlertDialog.Builder alert = new AlertDialog.Builder( SendSms.this); alert.setMessage("You Cross the limit of 10 Words !"); alert.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); alert.show(); } } }; 

  • Come sbarazzarsi della sottolineatura in una string spannabile con un object cliccabile?
  • Come posso aprire un PDF nella mia applicazione Android e permettere agli utenti di utilizzare i collegamenti ipertestuali incorporati?
  • IntentNotFoundException per TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA
  • Misteri di importzione di librerie (es. Picasso) a Android Studio
  • 'Dipendenza template non supportta: Aggiorna il tuo plug-in Android Eclipse' con SDK Tools v22
  • Richieste HTTP periodiche che utilizzano RxJava e Retrofit
  • Google Maps v2: Errore di authorization
  • Come verificare che l'applicazione è stata firmata dal mio certificato?
  • L'elemento richiesto non è disponibile per l'acquisto - android nella fatturazione dell'app
  • Studio di Android: l'emulatore è in esecuzione ma non viene visualizzato nell'applicazione di esecuzione "scegli un dispositivo in esecuzione"
  • Come faccio a rilevare se uno sprite è stato toccato in Java libGDX?
  • Problema di networking di JellyBean di Android
  • 6 Solutions collect form web for “Osservatore di text in Android”

    Questo è il comportmento comune di questo metodo. Devi gestire utilizzando la bandiera.

    Utilizza questo codice

      private TextWatcher mTextEditorWatcher = new TextWatcher() { boolean flag = false; @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { if (s.length() == 10) { if (!flag) { messageBody.setImeOptions(EditorInfo.IME_ACTION_DONE); AlertDialog.Builder alert = new AlertDialog.Builder( SendSms.this); alert.setMessage("You Cross the limit of 10 Words !"); alert.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); alert.show(); } flag = true; } else { flag = false; } } }); 

    Altri riferimenti

    Gli events di TextWatcher vengono sparati più volte

    Gli events di TextWatcher vengono chiamati due volte


    Meglio usare setError . Leggete come usarla.

      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( SendSms.this); AlertDialog alertDialog ; private TextWatcher mTextEditorWatcher = new TextWatcher() { public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { // This sets a textview to the current length // mTextView.setText(String.valueOf(s.length())); if (s.length() >= 10) { messageBody.setImeOptions(EditorInfo.IME_ACTION_DONE); alertDialogBuilder.setMessage("You Cross the limit of 10 Words !"); alertDialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); alertDialog = alertDialogBuilder.create(); if(alertDialog != null && !alertDialog.isShowing()){ alertDialog.show(); } } else { mTextView.setText(String.valueOf(s.length())); } } public void afterTextChanged(Editable s) { } }; 

    Ho modificato il codice. Dichiarare globalmente il dialogo di avviso e verificare se l'alertDialog è già mostrato e quindi visualizzare l'avviso

    Prova questo..

    hai provato in onTextChanged

     private TextWatcher mTextEditorWatcher = new TextWatcher() { public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { // This sets a textview to the current length // mTextView.setText(String.valueOf(s.length())); if (s.length() == 10) { messageBody.setImeOptions(EditorInfo.IME_ACTION_DONE); AlertDialog.Builder alert = new AlertDialog.Builder( SendSms.this); alert.setMessage("You Cross the limit of 10 Words !"); alert.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); alert.show(); } } public void afterTextChanged(Editable s) { } }; 

    Basta fare l'istanza di avviso globale, functionrà bene.

      private AlertDialog.Builder alert ; 

    nel tuo onCreate

      alert = new AlertDialog.Builder( RegisterActivity.this); 

    nel tuo postTextChanged

      public void afterTextChanged(Editable s) { if (s.length() == 10) { //messageBody.setImeOptions(EditorInfo.IME_ACTION_DONE); alert.setMessage("You Cross the limit of 10 Words !"); alert.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); alert.show(); } } 

    Ciao ho fatto questo lavoro per il numero di telefono, quando raggiunge 5 cifre, lo spazio automaticamente. Puoi utilizzare il mio codice. Controlli sotto il codice.

     public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.length() == 5 && start == 4) { txtNumber.removeTextChangedListener(this); txtNumber.append(" "); txtNumber.addTextChangedListener(this); } if (s.length() == 6 && start == 5) { txtNumber.removeTextChangedListener(this); String newtext = s.toString().substring(0, s.length() - 1) + " " + s.charAt(s.length() - 1); txtNumber.setText(""); txtNumber.append(newtext); txtNumber.addTextChangedListener(this); } } 

    Fammi sapere se hai bisogno di più aiuto

    Prova il codice seguente:

    Istanza globale:

     private AlertDialog.Builder alert; 

    TextWatcher:

     private TextWatcher mTextEditorWatcher = new TextWatcher() { public void beforeTextChanged(CharSequence s, int start, int count, int after) { } public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.length() >= 10) { messageBody.setImeOptions(EditorInfo.IME_ACTION_DONE); // alert = new AlertDialog.Builder(MainActivity.this); // alert.setMessage("You Cross the limit of 10 Words !"); // alert.setPositiveButton("OK", new DialogInterface.OnClickListener() { // public void onClick(DialogInterface dialog, int whichButton) { // } // }); // alert.show(); // Else you should use the following one to show error message messageBody.setError("You Cross the limit of 10 Words !"); } else { messageBody.setError(null); } } public void afterTextChanged(Editable s) { } }; 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.