Android IME, imposta la posizione del cursore in EditText

Sto lavorando sulla tastiera soft where devo impostare la posizione del cursore nel text di modifica IME.

immettere qui la descrizione dell'immagine

  • Scattare foto con la camera su Android in modo programmato
  • Visualizzazione mappa Google non più caricamento dopo l'aggiornamento ADT; problema di authentication apparente?
  • Come utilizzare la visualizzazione del calendario personalizzato in Android e come impostare l'avviso per il promemory?
  • Il motivo per le risorse e le risorse crude in Android
  • Posizione di listview del cassetto di navigazione non rinfrescante
  • Registrazione delle query SQL in android
  • Come mostrato nell'image sopra, avevo creato una tastiera soft, visto che possiamo vedere un text inserito nel text di modifica e nella posizione corrente del cursore (indicato dall'indicatore blu).

    Ho bisogno di impostare la posizione del cursore alla fine della linea corrente (nel nostro caso alla fine della row visualizzata in primo luogo dal colore rosso nell'image)

    Ho provato con diverse funzioni fornite con InputConnection , ho provato con,

     CharSequence seq = conn.getTextBeforeCursor(1000, 0); // will get as much characters as possible on the left of cursor 

    E ancora una cosa, devo anche contare al numero di righe nel text di modifica (nel nostro caso sono due).

  • Differenza tra AAR, JAR, DEX, APK in Android
  • Devo call getWritableDatabase () each volta che manipolo i dati
  • Come importre R nel progetto Android?
  • Risorse e frameworks per lo sviluppo mobile (iphone, android) usando HTML5
  • Come creare il pipe denominato (mkfifo) in Android?
  • Mantenere le informazioni sul conto in tutte le attività in studio android
  • 3 Solutions collect form web for “Android IME, imposta la posizione del cursore in EditText”

    Di seguito è riportto un codice di lavoro per fare quello che vuoi.

    È abbastanza semplice:

    Per impostare la posizione del cursore alla fine della prima row, dobbiamo prima get l'indice dell'ultimo carattere di text di tale row. Esiste un metodo sul Layout di EditTexts per eseguire questa operazione.

    Il layout è quello che il edittext usa internamente per layout del text e ha un metodo chiamato getLineEnd che restituisce l'indice di text alla fine di una row (dobbiamo sottrarre 1 da questo, altrimenti il ​​nostro cursore finirebbe all'inizio della linea successiva).

    Una volta che abbiamo la posizione per impostare il cursore, utilizziamo semplicemente il metodo setSelection di EditText.

     int endOfFirstLine = editText.getLayout().getLineEnd(0)-1; //set the text selection (cursor postion) to that index editText.setSelection(endOfFirstLine); 

    Possiamo anche get facilmente il numero di righe

     int lineCount = editText.getLineCount(); 

    Il trucco con questo codice è che deve essere eseguito dopo che il layout di EditText è stato costruito. Ciò significa che se abbiamo appena messo questo nel nostro onCreate o onResume, non functionrebbe. Il count delle linee sarebbe 0.

    Quindi dobbiamo eseguire questo codice dopo che il passaggio di layout è stato completato. Quello che facciamo aggiungendo un listener di layout al edittext e eseguendo il codice dopo il suo completamento.

     editText.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { } 

    Ecco il codice completo di attività:

     public class MainActivity extends Activity { private EditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.test_edittext); editText.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { //this gives us the index of the text at the end of the first line. int endOfFirstLine = editText.getLayout().getLineEnd(0)-1; //set the text selection (cursor postion) to that index editText.setSelection(endOfFirstLine); //we can get the line count with getLineCount int lineCount = editText.getLineCount(); Toast.makeText(MainActivity.this, "number of edittext lines: " + lineCount, Toast.LENGTH_LONG).show(); } }); } @Override protected void onResume() { super.onResume(); } } 

    Ciao amici grazie per l'apprezzamento. Prima di due giorni ho avuto la mia soluzione, ma non riesco ad aggiornare la mia risposta.

    Per quello che ho usato sotto il codice,

    Se usiamo la versione api superiore a 10,

     sendDownUpKeyEvents(0x0000007b); 

    perché questo metodo è aggiunto in api 11.

    Se usiamo la versione api less di 11,

     if (getCurrentInputConnection() != null) { CharSequence textAfter = getCurrentInputConnection().getTextAfterCursor(1024, 0); if (!TextUtils.isEmpty(textAfter)) { int newPosition = 1; while (newPosition < textAfter.length()) { char chatAt = textAfter.charAt(newPosition); if (chatAt == '\n' || chatAt == '\r') { break; } newPosition++; } if (newPosition > textAfter.length()) newPosition = textAfter.length(); try { CharSequence textBefore = getCurrentInputConnection().getTextBeforeCursor(Integer.MAX_VALUE, 0); if (!TextUtils.isEmpty(textBefore)) { newPosition = newPosition + textBefore.length(); } getCurrentInputConnection().setSelection(newPosition, newPosition); } catch (Exception e) { e.printStackTrace(); } } } 

    Mi dispiace dire che non sarai in grado di farlo da un IME. A tal fine è necessario accedere a determinati methods del text EditText, ma non esiste alcuna API ansible perché il controllo della visualizzazione di text è in un'attività un altro process, non il process.

    Tutte le informazioni che è ansible get sono quelle contenute nel parametro EditorInfo che è ansible visualizzare in alcuni methods di InputMethodService, ad esempio onStartInput (l'attributo EditorInfo, il riavvio boolean). Probabilmente in futuro è ansible includere un altro modo di accedere a maggiori informazioni, ma a questo punto tutto quello che puoi fare è quello di cambiare la posizione del cursore con il metodo InputConnection di InputConnection ma non sai neanche che è la posizione della fine della prima linea, in modo che non sia veramente utile per quello che ti serve.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.