2012-12-13 19 views
8

Tôi đang xây dựng một ứng dụng trò chuyện đơn giản, nơi người dùng có khả năng gửi văn bản và biểu tượng cảm xúc. Tôi có thể gửi cả văn bản và biểu tượng cảm xúc cho một điện thoại khác. vấn đề của tôi là:Văn bản bị rối loạn với ImageSpan trong EditText

1. Khi tôi gõ một cái gì đó và thêm một biểu tượng cảm xúc:

enter image description here

Sau đó, tôi không thể gõ bất kỳ văn bản ngay trước và ngay sau khi hình ảnh. Tôi có thể viết trước chữ "o". Hệ thống "nhìn thấy" mà tôi gõ, vì vậy ngay cả khi tôi gõ "mật ong" sau khi cười, tôi không thể nhìn thấy nó, nhưng EditText đăng ký nó và thông điệp được gửi:

enter image description here

2.When Tôi chỉ thêm một biểu tượng cảm xúc cho Edittext sau đó tôi xóa nó, tôi không thể gõ bất cứ điều gì vì biểu tượng cảm xúc đã xóa xuất hiện. Nó chỉ xuất hiện một lần, vì vậy bất kể có bao nhiêu ký tự tôi nhập, EditText trông giống như trước khi tôi xóa biểu tượng cảm xúc, NHƯNG văn bản được gửi mà không có biểu tượng cảm xúc, giống như trong cả ba trường hợp.

3. Khi tôi gõ "cái gì đó" trong EditText sau đó chèn một biểu tượng cảm xúc sau khi "một số":

enter image description here

Sau đó, tôi đưa con trỏ sau khi biểu tượng cảm xúc và xóa nó, ở đây những gì còn lại :

enter image description here

Nhưng sứ điệp chính xác được gửi đi khi tôi bấm nút gửi:

enter image description here

Đó là những gì bên trong trình nghe nút của biểu tượng cảm xúc (phương pháp này được kích hoạt khi tôi nhấp vào biểu tượng cảm xúc để thêm nó vào EditText).

ib_happy.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 

     int cursorPosition = mOutEditText.getSelectionStart(); 
      mOutEditText.getText().insert(cursorPosition, smileys[0]); 
     SpannableStringBuilder ssb = new SpannableStringBuilder(mOutEditText.getText()); 
     ssb.setSpan(new ImageSpan(bitmapArray.get(0), ImageSpan.ALIGN_BASELINE), cursorPosition, cursorPosition+2, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
     mOutEditText.setText(ssb, BufferType.SPANNABLE); 
      mOutEditText.setSelection(cursorPosition+2); 
     dialog_emoticon.dismiss(); 
    } 
}); 
+0

nơi bạn có thể khắc phục? – noxius

+1

Vâng tôi đã thấy như bạn thấy trong câu trả lời được chấp nhận – erdomester

Trả lời

6

Tôi đã tìm ra giải pháp. Tất cả những gì tôi phải làm là thay đổi Spannable.SPAN_INCLUSIVE_INCLUSIVE thành Spannable.SPAN_EXCLUSIVE_EXCLUSIVE

+0

Tôi có cùng một vấn đề, nhưng 'Spannable.SPAN_EXCLUSIVE_EXCLUSIVE' không giải quyết được vấn đề tại thiết bị Jelly Bean của tôi. Tại Android 2.2, nó hoạt động như mong đợi. Bạn có thông tin gì về điều đó không? – fish

+0

Thật không may là tôi không và tôi không sở hữu thiết bị Jelly Bean – erdomester

+0

@fish Tôi đã thử nghiệm trong Jelly Bean (trình mô phỏng) và không có vấn đề gì. – BornToCode

0

tôi sẽ thêm một textwatcher để EditText đó và xem như các loại người dùng, như vậy tôi có thể định vị lại hình ảnh/thiết lập các văn bản/sửa chữa/xác nhận đầu vào/etc.

editText.addTextChangedListener(textWatcher); 

textWatcher = new TextWatcher() { 
    public void afterTextChanged(Editable s) { 
     //editText.doStuffHere 
     //reposition your image/etc. 
    } 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { } 
    public void onTextChanged(CharSequence s, int start, int before, int count) { } 
}; 
+0

Vì vậy, khi tôi gõ hello :)/:) là số cười/txt là 7. Sau đó, tôi nhập "Mật ong", là vô hình, nhưng nó có bởi vì số lượng gõ ký tự đã tăng lên 12. Tôi có thể làm gì về điều này? – erdomester

+0

Xin lỗi tôi đang ở chế độ đường dẫn trên trang này. Có lẽ một cái gì đó dưới afterTextChanged .... if (s.contains (":)")) và sau đó theo onTextChanged sử dụng bắt đầu, trước, và đếm để tái tạo các văn bản đầu ra bằng cách xác định nơi ":)" của là và sử dụng editText.getText & editText.setText. – logray