2012-07-15 17 views
6

मैं एक साधारण चैट एप्लिकेशन कर रहा हूं और संदेश लिखते समय मैं संपादनों पर मुस्कुराहट दिखाना चाहता हूं।एडिटटेक्स्ट (स्माइलीज़) पर छविस्पैन। स्विफ्टकी कीबोर्ड के साथ काम नहीं करता

मैं इस जो पात्रों की पहचान के लिए एक ImageSpan सोचा एक छवि से subsituted हो जाएगा है (यह भी कहा जाता है केवल जब एक स्माइली चरित्र EditText पर डाला जाता है):

for (index = start; index < start+num_chars; index++) { 
     if (index + 1 > editable.length()) 
      continue; 
      if(emoticons.containsKey(editable.subSequence(index, index + 1).toString())){ 
      int length=1; 

      Drawable drawable = context.getResources().getDrawable(emoticons.get(editable.subSequence(index, index + 1).toString())); 
      Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); 


      int size=Utils.GetDipsFromPixel(context, (int)(textSize*1.3)); 

      Drawable d = new BitmapDrawable(Bitmap.createScaledBitmap(bitmap, size, size, true)); 
      int dWidth = d.getIntrinsicWidth(); 
      int dHeight = d.getIntrinsicHeight(); 

      d.setBounds(0 , -dHeight, dWidth, 0); 
      ImageSpan span; 
      span = new ImageSpan(d,ImageSpan.ALIGN_BASELINE); 
      editable.setSpan(span, index, index + length,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

      index += length - 1; 
      } 

     } 

मैं SPAN_EXCLUSIVE_EXCLUSIVE टैग का उपयोग कर रहा स्थापित करने के लिए अवधि, लेकिन मुझे स्विफ्टकी कीबोर्ड के साथ समस्याएं हैं क्योंकि जब मैं संपादन में एक स्माइली डालता हूं, तो छवि के ठीक बाद मैं जो भी लिखता हूं, वह छवि के नीचे रहता है (जैसे SPAN_EXCLUSIVE_INCLUSIVE)। एंड्रॉइड डिफ़ॉल्ट कीबोर्ड के साथ मैं इस समस्या का सामना करता हूं।

मैं केवल एडिटटेक्स्ट पर व्हाट्सएप एप्लिकेशन वही व्यवहार श्वेत स्माइली चाहता हूं।

कोई सुझाव? मुझे अपने कोड में कोई बदलाव करना है?

संपादित करें: "संपादन योग्य" चर विधि को पास किया गया है। यह txtMessage.getText() मान है जहां txtMessage एक संपादन टेक्स्ट है।

धन्यवाद!

संपादित करें: केवल कोड का एक भाग फैलाएं! यह multiline में अच्छा काम करता है! मुझे लगता है कि समस्या Drawable-> बिटमैप-> ResizedBitmap-> Drawable का उपयोग करने में थी।

public static final HashMap<String, Integer> emoticons = new HashMap(); 
static { 
    emoticons.put("\ue415", R.drawable.e415); 
    emoticons.put("\ue056", R.drawable.e056); 
    emoticons.put("\ue057", R.drawable.e057); 
... 
public static Spannable getSmiledText(Context context, Spannable editable, 
     int start, int num_chars, float textSize) { 

    int index; 
    for (index = start; index < start + num_chars; index++) { 
     if (index + 1 > editable.length()) 
      continue; 
     if (EmojiLayout.emoticons.containsKey(editable.subSequence(index, 
       index + 1).toString())) { 
      int length = 1; 

      Bitmap smiley = BitmapFactory.decodeResource(context.getResources(), ((Integer) EmojiLayout.emoticons.get(editable.subSequence(index, 
        index + 1).toString()))); 
      int size = Utils.GetDipsFromPixel(context, 
      (int) (textSize * 1.37)); 

      Bitmap scaledbmp=Bitmap.createScaledBitmap(
        smiley, size, size, false); 
      ImageSpan span; 
      span = new ImageSpan(scaledbmp); 
      Log.d("EmojiLayout", "Index: " + String.valueOf(index) + "To: " 
        + String.valueOf(index + length)); 
      editable.setSpan(span, index, index + length, 
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      index += length - 1; 
     } 
    } 
    return editable; 
} 
+0

मेल डेवलपर को इस दोष और वे क्या कहते हैं .. – Ronnie

उत्तर

13

उपयोग इस एक ::

public static CharSequence addSmileySpans(Context ch, CharSequence your_recieved_message) 
{ 
    //smilyRegexMap = new HashMap<Integer, String>(); 

private static final HashMap<String, Integer> smilyRegexMap = new HashMap<String, Integer>(); 
smilyRegexMap.put(">:-\\(" , R.drawable.fb_grumpy); 
     smilyRegexMap.put(">:\\(" , R.drawable.fb_grumpy); 
     smilyRegexMap.put(">:-O" , R.drawable.fb_upset); 
     smilyRegexMap.put(":-\\)" , R.drawable.fb_smile); 
     smilyRegexMap.put(":\\)",R.drawable.fb_smile); 
     smilyRegexMap.put(":-\\]" , R.drawable.fb_smile); 
     smilyRegexMap.put(":-\\(", R.drawable.fb_frown); 




    System.out.println("==In Spannable Function.........."); 
    SpannableStringBuilder builder = new SpannableStringBuilder(your_recieved_message); 

    System.out.println("==================Size of Smily : "+ smilyRegexMap.size()); 

    @SuppressWarnings("rawtypes") 
    Iterator it = smilyRegexMap.entrySet().iterator(); 
    while (it.hasNext()) { 
     @SuppressWarnings("rawtypes") 
     Map.Entry pairs = (Map.Entry) it.next(); 




     Pattern mPattern = Pattern.compile((String) pairs.getKey(),Pattern.CASE_INSENSITIVE); 
     Matcher matcher = mPattern.matcher(your_recieved_message); 

     while (matcher.find()) { 

       Bitmap smiley = BitmapFactory.decodeResource(ch.getResources(), ((Integer) pairs.getValue())); 
       Object[] spans = builder.getSpans(matcher.start(), matcher.end(), ImageSpan.class); 
       if (spans == null || spans.length == 0) { 
        builder.setSpan(new ImageSpan(smiley), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       } 
     } 
    } 
    return builder; 
} 
+0

Yeeessss !!! ! मुझे स्विफ्टकी के साथ एक ही समस्या है, लेकिन इस विधि के साथ आपने स्माइलीज़ के साथ सूचीदृश्य वस्तुओं पर शब्द लपेटने के साथ अन्य समस्या हल की है !!!! अब मुझे केवल स्क्रॉल की गति में सुधार करना है क्योंकि मेरे पास 470 स्माइली हैं! स्क्रॉल की गति में सुधार करने के लिए कोई सुझाव? – Igor

+0

मैंने स्ट्रिंग के एक हिस्से को केवल विस्तारित करने के लिए अपना कोड संपादित किया है। मैंने इसे पहले संदेश में पोस्ट किया है – Igor

+0

मैं डिस्प्ले स्माइलीज़ के लिए संवाद दृश्य का उपयोग कर रहा हूं .. मैंने छवियों और कोड के साथ नया उत्तर दिया है। यह आपकी मदद कर सकता है। .. –

4

तुम बस ImageSpan का उपयोग कर एक Spannable पाठ का निर्माण और उसके बाद TextView या EditText को Spannable setText रूप CommonsWare इस post में सुझाव दिया जाना है। तुम भी A-IV's समाधान का उपयोग करने की कोशिश कर सकते हैं:

private static final HashMap<String, Integer> emoticons = new HashMap(); 
    static { 
     emoticons.put(":*", R.drawable.emo_im_kiss); 
     emoticons.put(":-D", R.drawable.emo_im_glad); 
     emoticons.put(":)", R.drawable.emo_im_happy); 
     emoticons.put(":-(", R.drawable.emo_im_sad); 
     ... 
    } 

    public static Spannable getSmiledText(Context context, String text) { 

    SpannableStringBuilder builder = new SpannableStringBuilder(text); 
    int index; 

    for (index = 0; index < builder.length(); index++) { 
     for (Entry<String, Integer> entry : emoticons.entrySet()) { 
      int length = entry.getKey().length(); 
      if (index + length > builder.length()) 
       continue; 
      if (builder.subSequence(index, index + length).toString().equals(entry.getKey())) { 
       builder.setSpan(new ImageSpan(context, entry.getValue()), index, index + length, 
       Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
       index += length - 1; 
       break; 
      } 
    } 
    } 
    return builder; 
    } 
+0

मैंने इस समाधान की कोशिश की है लेकिन मेरी समस्या यह है कि जब भी मैं संपादन टेक्स्ट पर एक स्माइली डालता हूं और मैं केवल नए डाले गए स्माइली चरित्र को बदलना चाहता हूं। मुझे txtMessage.getText() (स्पैन करने योग्य) विधि को पास करना है, इसलिए मैं केवल नए चरित्र को बदल सकता हूं। यदि आप एक स्माइली डालते हैं तो मुझे आपके द्वारा भेजी जाने वाली विधि को सभी पात्रों को जांचना पड़ता है। – Igor

+0

मैंने ImageSpan को एक SpannableStringBuilder पर सेट करने का प्रयास किया है और नतीजा वही है ... WIth SwiftKey कीबोर्ड मैं ImageSpan के बाद ही लिख नहीं सकता क्योंकि सभी वर्ण ImageSpan द्वारा छिपाए गए हैं ....-( – Igor

-1

स्माइलीज का XML फ़ाइल में डाल छवि बटन

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 

android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 
<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="#dddddd" 
    android:padding="10dp" > 

    <ImageButton 
     android:id="@+id/btn_smile" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:padding="10dp" 
     android:src="@drawable/fb_smile" /> 

    <ImageButton 
     android:id="@+id/btn_kiss" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:padding="10dp" 
     android:src="@drawable/fb_kiss" /> 

    <ImageButton 
     android:id="@+id/btn_wink" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:padding="10dp" 
     android:src="@drawable/fb_wink" /> 

    <ImageButton 
     android:id="@+id/btn_cry" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:padding="10dp" 
     android:src="@drawable/fb_cry" /> 

    <ImageButton 
     android:id="@+id/btn_grumpy" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:padding="10dp" 
     android:src="@drawable/fb_grumpy" /> 

    <ImageButton 
     android:id="@+id/btn_upset" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:padding="10dp" 
     android:src="@drawable/fb_upset" /> 
</LinearLayout> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="#dddddd" 
    android:padding="10dp" > 

    <ImageButton 
     android:id="@+id/btn_frown" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:padding="10dp" 
     android:src="@drawable/fb_frown" /> 

    <ImageButton 
     android:id="@+id/btn_tougn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:padding="10dp" 
     android:src="@drawable/fb_tounge" /> 

    <ImageButton 
     android:id="@+id/btn_grin" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:padding="10dp" 
     android:src="@drawable/fb_grin" /> 

    <ImageButton 
     android:id="@+id/btn_gasp" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:padding="10dp" 
     android:src="@drawable/fb_gasp" /> 

    <ImageButton 
     android:id="@+id/btn_glasses" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:padding="10dp" 
     android:src="@drawable/fb_glasses" /> 

    <ImageButton 
     android:id="@+id/btn_unsure" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@null" 
     android:padding="10dp" 
     android:src="@drawable/fb_unsure" /> 
</LinearLayout> 
</LinearLayout> 

// === ================================================== ===

संवाद कक्षा में इस कोड को

private class SmileyMenu extends Dialog implements android.view.View.OnClickListener{ 

    private Chat cht; 
    Context con; 
    public String MyStatus1=""; 
    public SmileyMenu(Chat cht) { 
     super(cht); 
     this.con = cht; 
     this.cht = cht; 
    } 



    @Override 
    protected void onStart() { 
     // TODO Auto-generated method stub 
     super.onStart(); 


     setTitle("Select Smileys :"); 

     setContentView(R.layout.smily_menu); 

     ImageButton btnSmile = (ImageButton)findViewById(R.id.btn_smile); 
     ImageButton btnkiss = (ImageButton)findViewById(R.id.btn_kiss); 
     ImageButton btnwink = (ImageButton)findViewById(R.id.btn_wink); 
     ImageButton btncry = (ImageButton)findViewById(R.id.btn_cry); 
     ImageButton btngrupy = (ImageButton)findViewById(R.id.btn_grumpy); 
     ImageButton btnupset = (ImageButton)findViewById(R.id.btn_upset); 
     ImageButton btnfrown = (ImageButton)findViewById(R.id.btn_frown); 
     ImageButton btngrin = (ImageButton)findViewById(R.id.btn_grin); 
     ImageButton btngasp = (ImageButton)findViewById(R.id.btn_gasp); 
     ImageButton btnglass = (ImageButton)findViewById(R.id.btn_glasses); 
     ImageButton btnunsure = (ImageButton)findViewById(R.id.btn_unsure); 
     ImageButton btndevil = (ImageButton)findViewById(R.id.btn_devil); 
     ImageButton btnheart = (ImageButton)findViewById(R.id.btn_heart); 
     ImageButton btnpacman = (ImageButton)findViewById(R.id.btn_pacman); 
     ImageButton btn42 = (ImageButton)findViewById(R.id.btn_42); 


     btnSmile.setOnClickListener(this); 
     btnkiss.setOnClickListener(this); 
     btnwink.setOnClickListener(this); 
     btncry.setOnClickListener(this); 
     btngrupy.setOnClickListener(this); 
     btnupset.setOnClickListener(this); 
     btnfrown.setOnClickListener(this); 
     btngrin.setOnClickListener(this); 
     btngasp.setOnClickListener(this); 
     btnglass.setOnClickListener(this); 
     btnunsure.setOnClickListener(this); 
     btndevil.setOnClickListener(this); 
     btnheart.setOnClickListener(this); 
     btnpacman.setOnClickListener(this); 
     btn42.setOnClickListener(this); 




    } 



    @Override 
    public void onClick(View v) { 


     switch (v.getId()) { 

     case R.id.btn_smile: 
      cht.setMyText(":-)"); 
      break; 

     case R.id.btn_kiss: 
      cht.setMyText(":-*"); 
      break; 

     case R.id.btn_wink: 
      cht.setMyText(";-)"); 
      break; 

     case R.id.btn_cry: 
      cht.setMyText(":'("); 
      break; 

     case R.id.btn_grumpy: 
      cht.setMyText(">:-("); 
      break; 

     case R.id.btn_upset: 
      cht.setMyText(">:-O"); 
      break; 

     case R.id.btn_frown: 
      cht.setMyText(":-("); 
      break; 

     case R.id.btn_tougn: 
      cht.setMyText(":-p"); 
      break; 

     case R.id.btn_grin: 
      cht.setMyText(":-D"); 
      break; 

     case R.id.btn_gasp: 
      cht.setMyText(":-O"); 
      break; 

     case R.id.btn_glasses: 
      cht.setMyText("8-)"); 
      break; 

     case R.id.btn_unsure: 
      cht.setMyText(":-/"); 
      break; 

     case R.id.btn_devil: 
      cht.setMyText("3:-)"); 
      break; 

     case R.id.btn_heart: 
      cht.setMyText("<3"); 
      break; 

     case R.id.btn_pacman: 
      cht.setMyText(":v"); 
      break; 

     case R.id.btn_42: 
      cht.setMyText(":42:"); 
      break; 

     default: 
      Toast.makeText(con, "Sorryyyyyy", Toast.LENGTH_SHORT).show(); 
      break; 
     } 

     dismiss(); 
    } 
} 

// ==================

छवि की डाल जब रनटाइम पर स्माइली मेनू के लिए बटन क्लिक करें

enter image description here

======================================== =============

प्रयास करें इस .. आप के लिए मदद किया जा सकता है बेस्ट भाग्य ..

+0

मेरा प्रश्न संदेश सूचीदृश्य पर गति को बेहतर बनाने वाला था, क्योंकि सूची एडाप्टर को संदेश प्रदर्शित होने पर हर बार मुस्कुराहट मिलनी चाहिए। मैंने किसी प्रकार का कैश लागू किया है लेकिन उपयोगकर्ता एप्लिकेशन कॉन्फ़िगरेशन पर फ़ॉन्ट आकार बदल सकता है और मैं स्माइली आकारों को फिर से समझता हूं ताकि उनके पास पाठ के समान ऊंचाई हो। फिर भी धन्यवाद! – Igor

0

इस तरह की कोशिश करो, उम्मीद है कि इस आप अपनी समस्या को हल करने में मदद मिलेगी।

private static LinkedHashMap<String,Integer> emojisHashMap; 

    public static LinkedHashMap<String, Integer> getEmojisHashMap() { 
     if (emojisHashMap == null || emojisHashMap.size() == 0) { 
      emojisHashMap = new LinkedHashMap<String, Integer>(); 

      emojisHashMap.put(":=q", R.drawable.smiley1); 
      emojisHashMap.put(":=w", R.drawable.smiley2); 
      emojisHashMap.put(":=e", R.drawable.smiley3); 
      emojisHashMap.put(":=r", R.drawable.smiley4); 

      return emojisHashMap; 
     } else { 
      return emojisHashMap; 
     } 

    } 

    public Spannable getSmiledText(CharSequence text) { 
     SpannableStringBuilder builder; 

     try { 
      builder = (SpannableStringBuilder) text; 
     }catch (Exception e){ 
      builder = new SpannableStringBuilder(text); 
     } 
     if (getEmojisHashMap().size() > 0) { 
      int index; 
      for (index = 0; index < builder.length(); index++) { 
       if (Character.toString(builder.charAt(index)).equals(":")) { 
        for (Map.Entry<String, Integer> entry : getEmojisHashMap().entrySet()) { 
         int length = entry.getKey().length(); 
         if (index + length > builder.length()) 
          continue; 
         if (builder.subSequence(index, index + length).toString().equals(entry.getKey())) { 
          builder.setSpan(new ImageSpan(getContext(), entry.getValue()), index, index + length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
          index += length - 1; 
          break; 
         } 
        } 
       } 
      } 
     } 
     return builder; 
    }