2011-10-19 67 views
3

我想一個圖像插入到EDITTEXT我的代碼是:如何插入圖片到EDITTEXT

CharSequence charSeq= editText.getText()+" "; 
    SpannableString ss2 = new SpannableString(charSeq); 
    Drawable d2 = holder.image.getDrawable(); 
    d2.setBounds(0, 0, d2.getIntrinsicWidth(), d2.getIntrinsicHeight()); 

    ImageSpan span2 = new ImageSpan(d2, ImageSpan.ALIGN_BASELINE); 
    ss2.setSpan(span2,charSeq.length()-1, charSeq.length(), 

    Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

    editText.setText(ss2,BufferType.SPANNABLE); 

我的代碼可以運行,但我有一些不愉快的經歷,我想修改:

1:你知道當使用ss2.setSpan()方法時,圖像可以替換字符,我只想插入新圖像,不希望圖像替換字符。 2:你知道我的方法包括「editText.getText()+」「;」,我添加了一些額外的空間,以便圖像可以插入到CharSequence的最後一個。如何不需要添加一些Extra,圖片也插入到CharSequence的最後。

3.當我插入圖像到最後的CharSequence,光標不在最後,它出現在CharSequence的前面。如何將光標置於圖像後面。

4.我想不斷插入不同的CharSequence圖像,怎麼辦?

我的這麼多問題,我想你可以幫我非常感謝你。

+2

RIP英語... – chhameed

+0

我有一個很難讀OP問題。我很抱歉。 :( –

回答

9

做這樣的事情(注:你可以重用SpannableStringBuilder )

editText = (EditText)mRoot.findViewById(R.id.content); 
ImageSpan imageSpan = new ImageSpan(preview); 

SpannableStringBuilder builder = new SpannableStringBuilder(); 
builder.append(editText.getText()); 

// this is a string that will let you find a place, where the ImageSpan is. 
String imgId = "[img=1]"; 

int selStart = editText.getSelectionStart(); 

// current selection is replaceв with imageId 
builder.replace(editText.getSelectionStart(), editText.getSelectionEnd(), imgId); 

// This adds a span to display image where the imageId is. If you do builder.toString() - the string will contain imageId where the imageSpan is. 
// you can use it later - if you want to find location of imageSpan in text; 
builder.setSpan(imageSpan, selStart, selStart + imgId.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
editText.setText(builder); 

注:follow up answer對付的標籤部分缺失

+0

怎麼去獲取內容Editext容器圖像發送到服務器? 我使用: 字符串htmlString = Html.toHtml(新SpannableString(ediites.getText())); 標籤圖像回報:[?這個話題] 對不起,英語 –

+0

@babay你能幫助我在(HTTPS: //stackoverflow.com/q/46387217/1830228) –

-1

有了這個,你會得到的圖像左對齊,並使用image.Try後會得到光標:

mEditText.setCompoundDrawablesWithIntrinsicBounds(R.drawable.icon,0, 0,0); 
+0

我不僅要左對齊,我想插入imageto文字,可能是在左側,可能是正確的,可以在中間 – pengwang

+0

oh..i看到的。所以你要插入因爲如果你在EditText.i輸入文本不知道任何方式的形象。 – Hiral

4

試試這個,我希望你在尋找這樣的:

<EditText 
     android:id="@+id/editText1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:drawableLeft="@drawable/icon"> 
    </EditText> 

同樣的事情,你可以嘗試:

android:drawableRight 
android:drawableTop 
android:drawableBottom 
android:drawablePadding 
+1

你知道我想要動態插入圖像,不僅圖像添加到文本 – pengwang

1

我猜,你還需要進行文本編輯的一些功能:如果它的一個特點是圖像應被刪除刪除;這個類可以幫助(刪除所有圖像文本佔位符,如果它的字符被刪除)

public class ImageSpanTextWatcher implements TextWatcher { 
    Object[] mTouchedSpans; 
    int[] mSpanLength; 
    boolean replacing = false; 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     if (s instanceof SpannableStringBuilder) { 
      SpannableStringBuilder ssb = (SpannableStringBuilder) s; 
      mTouchedSpans = ssb.getSpans(start, start + count, ImageSpan.class); 
      if (mTouchedSpans != null && mTouchedSpans.length > 0) { 
       mSpanLength = new int[mTouchedSpans.length]; 
       for (int i = 0; i < mTouchedSpans.length; i++) { 
        mSpanLength[i] = ssb.getSpanEnd(mTouchedSpans[i]) - ssb.getSpanStart(mTouchedSpans[i]); 
       } 
      } 
     } 
    } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     if (s instanceof SpannableStringBuilder) { 
      SpannableStringBuilder ssb = (SpannableStringBuilder) s; 

      if (replacing) 
       return; 
      replacing = true; 
      if (mTouchedSpans != null && mTouchedSpans.length > 0) 
       for (int i = 0; i < mTouchedSpans.length; i++) { 
        int newLen = ssb.getSpanEnd(mTouchedSpans[i]) - ssb.getSpanStart(mTouchedSpans[i]); 
        if (newLen < mSpanLength[i]) { 
         ssb.replace(ssb.getSpanStart(mTouchedSpans[i]), ssb.getSpanEnd(mTouchedSpans[i]), ""); 
        } 
       } 
      mTouchedSpans = null; 
      mSpanLength = null; 
      replacing = false; 
     } 
    } 

    @Override 
    public void afterTextChanged(Editable s) {} 
} 
2
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import android.content.Context; 
import android.text.Spannable; 
import android.text.style.ImageSpan; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.widget.TextView; 

public class TextViewWithImages extends TextView { 

    public TextViewWithImages(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 
    public TextViewWithImages(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    public TextViewWithImages(Context context) { 
     super(context); 
    } 
    @Override 
    public void setText(CharSequence text, BufferType type) { 
     Spannable s = getTextWithImages(getContext(), text); 
     super.setText(s, BufferType.SPANNABLE); 
    } 

    private static final Spannable.Factory spannableFactory = Spannable.Factory.getInstance(); 

    private static boolean addImages(Context context, Spannable spannable) { 
     Pattern refImg = Pattern.compile("\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q/]\\E"); 
     boolean hasChanges = false; 

     Matcher matcher = refImg.matcher(spannable); 
    while (matcher.find()) { 
     boolean set = true; 
     for (ImageSpan span : spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class)) { 
      if (spannable.getSpanStart(span) >= matcher.start() 
      && spannable.getSpanEnd(span) <= matcher.end() 
       ) { 
       spannable.removeSpan(span); 
      } else { 
       set = false; 
       break; 
      } 
     } 
     String resname = spannable.subSequence(matcher.start(1), matcher.end(1)).toString().trim(); 
     int id = context.getResources().getIdentifier(resname, "drawable", context.getPackageName()); 
     if (set) { 
      hasChanges = true; 
      spannable.setSpan( new ImageSpan(context, id), 
           matcher.start(), 
           matcher.end(), 
           Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 
          ); 
     } 
    } 

     return hasChanges; 
    } 
    private static Spannable getTextWithImages(Context context, CharSequence text) { 
     Spannable spannable = spannableFactory.newSpannable(text); 
     addImages(context, spannable); 
     return spannable; 
    } 
} 

用途:

RES /佈局/ mylayout.xml

  <com.xyz.customandroid.TextViewWithImages 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:textColor="#FFFFFF00" 
       android:text="@string/can_try_again" 
       android:textSize="12dip" 
       style=... 
       /> 

RES /值/ strings.xml中

<string name="can_try_again">Press [img src=ok16/] to accept or [img src=retry16/] to retry</string> 

其中ok16.pngretry16。PNG是在RES /繪製/文件夾

+0

你能幫助我在本主題(https://stackoverflow.com/questions/46387217/android-insert-i mage-into-edittext)?謝謝 –

0

我的插入,並通過這種方式刪除的EditText上的圖像:

客戶按鈕插入

private void addImageInEditText(Drawable drawable) { 

     drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); 

     int selectionCursorPos = messageEditText.getSelectionStart(); 
     messageEditText.getText().insert(selectionCursorPos, "."); 
     selectionCursorPos = messageEditText.getSelectionStart(); 
     SpannableStringBuilder builder = new SpannableStringBuilder(messageEditText.getText()); 
     int startPos = selectionCursorPos - ".".length(); 
     builder.setSpan(new ImageSpan(drawable), startPos, selectionCursorPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     messageEditText.setText(builder); 
     messageEditText.setSelection(selectionCursorPos); 
    } 

自定義按鈕刪除

private void deleteImageFromEditText() { 
     String msgEditText = messageEditText.getText().toString(); 
     LOGE(TAG, "text length : " + msgEditText.length()); 
     if (msgEditText.length() > 0) { 
      int selectionCursorPos = messageEditText.getSelectionStart(); 
      int endPosition = messageEditText.getText().length(); 
      LOGE(TAG, "cursor Pos: " + selectionCursorPos + " endPosition : " + endPosition); 

      if (selectionCursorPos > 0) { 
       int deletingObjectStartPos = selectionCursorPos - 1; 
       messageEditText.getText().delete(deletingObjectStartPos, selectionCursorPos); 
       messageEditText.setSelection(deletingObjectStartPos); 
      } 
     } else { 
      messageEditText.setText(""); 
     } 
    } 

繪製對象可以通過多種方式進行測試,我做這樣的傳球:

Drawable drawable = getResources().getDrawable(R.drawable.ic_action_filter); 
addImageBetweentext(drawable);