2013-11-27 16 views
5

Tôi đang làm việc trên bàn phím mềm, nơi tôi cần đặt vị trí con trỏ trong văn bản chỉnh sửa IME.Android IME, đặt vị trí con trỏ trong EditText

enter image description here

Như trong hình trên, tôi đã tạo ra bàn phím mềm mại, như chúng ta có thể thấy một số văn bản được nhập vào chỉnh sửa văn bản và vị trí con trỏ hiện tại (thể hiện qua chỉ số màu xanh).

tôi cần phải đặt vị trí con trỏ vào cuối dòng hiện tại (trong trường hợp của chúng tôi ở phần cuối của dòng đầu tiên thể hiện bởi màu đỏ trong hình ảnh)

Tôi đã thử với các chức năng khác nhau được cung cấp với InputConnection, Tôi đã thử với,

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

Và một điều nữa, tôi cũng cần đếm số dòng trong văn bản chỉnh sửa (trong trường hợp của chúng tôi là hai).

Trả lời

2

Xin chào bạn bè cảm ơn sự đánh giá cao. Trước hai ngày, tôi nhận được giải pháp nhưng không thể cập nhật câu trả lời của mình.

Cho rằng tôi sử dụng dưới đây mã,

Nếu chúng ta đang sử dụng phiên bản api lớn hơn 10,

sendDownUpKeyEvents(0x0000007b); 

vì phương pháp này được thêm vào trong api 11.

Nếu chúng tôi đang sử dụng phiên bản api ít hơn 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

thats great, thực sự tôi hiểu rằng bạn đã cố gắng để xem xét các dòng tự động gói, không phải là dòng kết thúc với '\ n' hoặc '\ r', đó là ngắt dòng thực sự do người dùng nhập. Dù sao, vui vì bạn đã có một giải pháp! –

3

Dưới đây là một số mã hoạt động để thực hiện những gì bạn muốn.

Nó khá đơn giản:

Để thiết lập vị trí con trỏ đến cuối dòng đầu tiên, đầu tiên chúng ta phải có được các chỉ số của nhân vật văn bản cuối cùng của dòng đó. Có một phương pháp trên Giao diện EditTexts để thực hiện việc này.

Các Layout là những gì EditText sử dụng trong nội bộ để bố trí các văn bản, và nó có một phương pháp gọi là getLineEnd mà trả về chỉ mục văn bản ở phần cuối của một dòng (chúng ta cần phải trừ đi 1 từ này, nếu không chúng tôi con trỏ sẽ kết thúc ở đầu dòng tiếp theo).

Khi chúng tôi có vị trí đặt con trỏ, chúng tôi chỉ sử dụng phương thức setSelection của EditText.

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

Chúng tôi cũng có thể nhận được số dòng thực sự dễ dàng với

int lineCount = editText.getLineCount(); 

Thách thức đối với mã này, là nó phải được chạy sau khi Layout của EditText đã được xây dựng. Điều đó có nghĩa rằng nếu chúng ta chỉ cần đặt điều này trong onCreate hoặc onResume, nó sẽ không hoạt động. Số lượng dòng sẽ là 0.

Vì vậy, chúng tôi phải chạy mã này sau khi vượt qua bố cục đã được hoàn thành. Mà chúng ta làm bằng cách thêm một trình lắng nghe bố cục vào văn bản, và chạy mã sau khi nó hoàn thành.

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

Heres mã hoạt động đầy đủ:

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

Tôi xin lỗi để nói rằng bạn sẽ không có khả năng để làm điều đó từ một IME. Vì mục đích đó, bạn nên truy cập một số phương thức của EditText, nhưng không có bất kỳ API nào có sẵn, bởi vì điều khiển textview đang ở trong một hoạt động khác, chứ không phải quy trình của bạn.

Tất cả thông tin bạn có thể nhận được là những gì bạn có trong thông số EditorInfo mà bạn có thể thấy trong một số phương thức InputMethodService, chẳng hạn như onStartInput (thuộc tính EditorInfo, boolean restarting).Có lẽ trong tương lai bao gồm một số cách khác để truy cập thêm thông tin, nhưng tại thời điểm này, mọi thứ bạn có thể làm os những gì bạn đang yêu cầu, là thay đổi vị trí con trỏ bằng phương pháp setSelection của InputConnection, nhưng bạn cũng không biết đó là vị trí của sự kết thúc của dòng đầu tiên, do đó sẽ không thực sự hữu ích cho những gì bạn cần.

Các vấn đề liên quan