2013-11-27 23 views
5

Pracuję na klawiaturze programowej, w której muszę ustawić pozycję kursora w edytorze tekstu IME.IME systemu Android, ustaw pozycję kursora w EditText

enter image description here

Jak widać na powyższym obrazku, ja stworzył klawiaturę programową, jak widzimy jakiś tekst jest wpisany w edycji tekstu i aktualnej pozycji kursora (pokazanej przez wskaźnik niebieski).

muszę ustawić położenie kursora na koniec bieżącego wiersza (w naszym przypadku na końcu linii po raz pierwszy pokazane przez kolor czerwony w obrazie)

próbowałem z różnymi funkcjami wyposażonych InputConnection, starałem się,

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

i jeszcze jedno, ja też trzeba liczyć do liczby linii w edycji tekstu (w naszym przypadku jest to dwa).

Odpowiedz

2

Cześć przyjaciele dzięki za uznanie. Przed upływem dwóch dni otrzymałem rozwiązanie , ale nie mogę zaktualizować odpowiedzi.

za to stosowane poniżej kodu,

Jeżeli chcemy przy użyciu wersji API większą niż 10,

sendDownUpKeyEvents(0x0000007b); 

ponieważ metoda dodaje API 11.

Jeśli używamy wersji api mniejszej niż 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(); 
         } 
        } 
       } 
+0

To świetnie, właściwie zrozumiałem, że próbowaliście rozważyć automatycznie zawijane linie, a nie linie zakończone "\ n" lub "\ r", które są rzeczywistymi przerwami wprowadzonymi przez użytkownika. W każdym razie, cieszę się, że masz rozwiązanie! –

3

Poniżej znajduje się kilka działającego kodu, aby zrobić to, co chcesz.

To bardzo proste:

Aby ustawić położenie kursora do końca pierwszej linii, musimy najpierw uzyskać indeks ostatniego znaku tekstu tej linii. W tym celu jest metoda na EditTexts 'Layout.

Układ jest co EditText używa wewnętrznie do układu tekstu, a to ma metodę zwaną getLineEnd która zwraca indeks tekstu na końcu wiersza (musimy odjąć 1 od tego, w przeciwnym razie Our kursor kończyłby się na początku następnego wiersza).

Po ustawieniu kursora na, używamy metody edycji EditText.

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

Możemy również uzyskać liczbę wierszy naprawdę łatwo

int lineCount = editText.getLineCount(); 

Sztuczka z tego kodu, jest to, że musi być prowadzony po UKŁAD EditText został zbudowany. Oznacza to, że jeśli umieścimy to w naszym onCreate lub onResume, to nie zadziała. Liczba linii wynosiłaby 0.

Musimy więc uruchomić ten kod po zakończeniu przejścia układu. Co robimy, dodając detektor układu do edittext i uruchamiając kod po jego zakończeniu.

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

Herezje pełny kod działalność:

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(); 



    } 

} 
1

przykro mi to powiedzieć, nie będziecie w stanie tego zrobić z IME. W tym celu należy uzyskać dostęp do niektórych metod EditText, ale nie istnieje żaden dostępny interfejs API, ponieważ kontrola tekstu jest w działaniu innym procesem, a nie procesem.

Wszystkie informacje, które można uzyskać, znajdują się w parametrze EditorInfo, który można zobaczyć w niektórych metodach InputMethodService, takich jak onStartInput (atrybut EditorInfo, restart Boolean).Prawdopodobnie w przyszłości uwzględnimy inny sposób uzyskiwania dostępu do dodatkowych informacji, ale w tym momencie wszystko, co możesz zrobić, o co prosisz, to zmienić pozycję kursora za pomocą metody setSelection z InputConnection, ale ty też nie wiesz która jest pozycją końca pierwszej linii, więc nie będzie naprawdę przydatna do tego, czego potrzebujesz.

Powiązane problemy