2013-10-23 22 views
8

मैं एडिटटैक्ट के अंदर इमोटिकॉन्स डालने की कोशिश कर रहा हूं। मैंने इसे करने में कामयाब रहा है और यह ठीक काम करता है लेकिन मुझे एक समस्या है जब मैं इन इमोटिकॉन्स को सॉफ्ट कीबोर्ड का उपयोग करके एडिटटेक्स्ट से हटाने का प्रयास करता हूं। मैं एक ही डिलीट बटन के क्लिक के साथ यह क्रिया नहीं कर सकता। जब मैं एक नया ImageSpan डालता हूं तो मैं इसके लिए एक छवि आईडी को प्रतिस्थापित करता हूं लेकिन जब मैं डी आइकन को हटाने का प्रयास करता हूं तो मुझे छवि को हटाने से पहले सभी छवि आईडी अक्षर को हटाना होगा।SpannableStringBuilder और ImageSpan के साथ EditText ठीक काम नहीं करता

String fileName = "emoticon1.png"; 
Drawable d = new BitmapDrawable(getResources(), fileName); 
String imageId = "[" + fileName + "]"; 
int cursorPosition = content.getSelectionStart(); 
int end = cursorPosition + imageId.length(); 
content.getText().insert(cursorPosition, imageId); 

SpannableStringBuilder ss = new SpannableStringBuilder(content.getText()); 
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); 
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE); 
ss.setSpan(span, cursorPosition, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
content.setText(ss, TextView.BufferType.SPANNABLE); 
content.setSelection(end); 

मैं एक एकल हटाएँ बटन के क्लिक के साथ इमोटिकॉन को दूर करने की जरूरत है। क्या आप कृपया मेरी मदद कर सकते हैं?

धन्यवाद!

+0

आपके इमोटिकॉन (एफ.ए. हैश मैप ') की शुरुआत और अंत स्थिति को बचाने के बारे में क्या ?! प्रत्येक चरित्र पर आपको हटाने की ज़रूरत है, अगर स्थिति आपके पास हैमैप में एक इमोटिकॉन का अंत है। यदि हां, तो संपूर्ण हटाएं। (लेकिन आपको इमोटिकॉन्स से पहले बदलावों का ख्याल रखना होगा) – longilong

उत्तर

28

यह EditText के अंदर इमोटिकॉन्स को संभालने के लिए कार्यान्वयन है। EditText परिवर्तनों की निगरानी के लिए यह कार्यान्वयन TextWatcher का उपयोग करता है और पता चलता है कि कुछ टेक्स्ट हटा दिए जाने पर कुछ इमोटिकॉन हटा दिए गए थे या नहीं।

ध्यान दें कि यह कार्यान्वयन यह भी सत्यापित करता है कि कोई टेक्स्ट चयन हटा दिया गया था (न केवल हटाएं कुंजी)।

टेक्स्ट लिखते समय पाठ पूर्वानुमान के साथ समस्याओं से बचने के लिए, रिक्त स्थान के साथ इमोटिकॉन टेक्स्ट को घेरने की अनुशंसा की जाती है (टेक्स्ट भविष्यवाणी आसन्न पाठ के साथ इमोटिकॉन टेक्स्ट में शामिल हो सकती है)।

package com.takamori.testapp; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.Spanned; 
import android.text.TextWatcher; 
import android.text.style.ImageSpan; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.EditText; 

public class MainActivity extends Activity { 

    private EmoticonHandler mEmoticonHandler; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     EditText editor = (EditText) findViewById(R.id.messageEditor); 
     // Create the emoticon handler. 
     mEmoticonHandler = new EmoticonHandler(editor); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_insert_emoticon: 
       // WARNING: The emoticon text shall be surrounded by spaces 
       // to avoid issues with text prediction. 
       mEmoticonHandler.insert(" :-) ", R.drawable.smile); 
       return true; 

      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

    private static class EmoticonHandler implements TextWatcher { 

     private final EditText mEditor; 
     private final ArrayList<ImageSpan> mEmoticonsToRemove = new ArrayList<ImageSpan>(); 

     public EmoticonHandler(EditText editor) { 
      // Attach the handler to listen for text changes. 
      mEditor = editor; 
      mEditor.addTextChangedListener(this); 
     } 

     public void insert(String emoticon, int resource) { 
      // Create the ImageSpan 
      Drawable drawable = mEditor.getResources().getDrawable(resource); 
      drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 
      ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE); 

      // Get the selected text. 
      int start = mEditor.getSelectionStart(); 
      int end = mEditor.getSelectionEnd(); 
      Editable message = mEditor.getEditableText(); 

      // Insert the emoticon. 
      message.replace(start, end, emoticon); 
      message.setSpan(span, start, start + emoticon.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence text, int start, int count, int after) { 
      // Check if some text will be removed. 
      if (count > 0) { 
       int end = start + count; 
       Editable message = mEditor.getEditableText(); 
       ImageSpan[] list = message.getSpans(start, end, ImageSpan.class); 

       for (ImageSpan span : list) { 
        // Get only the emoticons that are inside of the changed 
        // region. 
        int spanStart = message.getSpanStart(span); 
        int spanEnd = message.getSpanEnd(span); 
        if ((spanStart < end) && (spanEnd > start)) { 
         // Add to remove list 
         mEmoticonsToRemove.add(span); 
        } 
       } 
      } 
     } 

     @Override 
     public void afterTextChanged(Editable text) { 
      Editable message = mEditor.getEditableText(); 

      // Commit the emoticons to be removed. 
      for (ImageSpan span : mEmoticonsToRemove) { 
       int start = message.getSpanStart(span); 
       int end = message.getSpanEnd(span); 

       // Remove the span 
       message.removeSpan(span); 

       // Remove the remaining emoticon text. 
       if (start != end) { 
        message.delete(start, end); 
       } 
      } 
      mEmoticonsToRemove.clear(); 
     } 

     @Override 
     public void onTextChanged(CharSequence text, int start, int before, int count) { 
     } 

    } 
} 
+0

"पाठ टाइप करते समय पाठ पूर्वानुमान के साथ समस्याओं से बचने के लिए, इमोटिकॉन टेक्स्ट को रिक्त स्थान के साथ घेरने की अनुशंसा की जाती है (पाठ भविष्यवाणी आसन्न पाठ के साथ इमोटिकॉन टेक्स्ट में शामिल हो सकती है)। " क्या इस समस्या का कोई बेहतर समाधान है? –

+0

इस समाधान के लिए बहुत बहुत धन्यवाद। अभी भी 4 साल बाद काम करता है और उपयोगी होता है (इस बात पर विचार करना कि एंड्रॉइड कितनी तेजी से बदलता है)। – abhiank

संबंधित मुद्दे