Android EditText中插入圖片並響應點擊事件

來源:互聯網
上載者:User

標籤:

EditText中插入圖片基本就是兩種方法:

1,通過Html.fromHtml(..)來實現     [mw_shl_code=java,true]eText.append(Html.fromHtml("<img src=‘" + R.drawable.ohoh + "‘/>",                                                imageGetter, null));[/mw_shl_code]2,通過ImageSpan與SpannableString/SpannableStringBuilder.[mw_shl_code=java,true]SpannableString ss = new SpannableString(imgStr);                                Drawable drawable = getResources().getDrawable(                                                R.drawable.bad_smelly);                                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),                                                drawable.getIntrinsicHeight());                                ImageSpan imageSpan = new ImageSpan(drawable,                                                ImageSpan.ALIGN_BASELINE);                                ss.setSpan(imageSpan, 0, imgStr.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);                                eText.append(ss);

下面貼上完整代碼,
點擊事件通過增加ClickableSpan來實現。

import android.os.Bundle;import android.app.Activity;import android.content.Context;import android.util.Log;import android.view.Menu;import android.graphics.drawable.Drawable;import android.text.Html;import android.text.Spannable;import android.text.SpannableString;import android.text.Html.ImageGetter;import android.text.Spanned;import android.text.method.LinkMovementMethod;import android.text.style.ClickableSpan;import android.text.style.ImageSpan;import android.view.View;import android.view.View.OnClickListener;import android.view.inputmethod.InputMethodManager;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {        private final String TAG = "MainActivity";        private EditText eText;        private int spanEnd;                @Override        public boolean onCreateOptionsMenu(Menu menu) {                // Inflate the menu; this adds items to the action bar if it is present.                getMenuInflater().inflate(R.menu.main, menu);                return true;        }        @Override        protected void onCreate(Bundle savedInstanceState) {                // TODO Auto-generated method stub                super.onCreate(savedInstanceState);                setContentView(R.layout.activity_main);                eText = (EditText) findViewById(R.id.test1_editText1);                final String imgStr = "[smile]";               //                eText.setOnClickListener(textListener); //用textListener實現ImageSpan響應點擊不靠譜,有時無效。                               final ImageGetter imageGetter = new ImageGetter() {                        @Override                        public Drawable getDrawable(String source) {                                int id = Integer.parseInt(source);                                // 根據id從資源檔中擷取圖片對象                                Drawable d = getResources().getDrawable(id);                                d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());                                return d;                        }                };                Button button = (Button) findViewById(R.id.test1_button1);                Button button2 = (Button) findViewById(R.id.test1_button2);                Button button3 = (Button) findViewById(R.id.test1_button3);                               button.setOnClickListener(new OnClickListener() {                        @Override                        public void onClick(View v) {                                // TODO Auto-generated method stub                                SpannableString ss = new SpannableString(imgStr);                                Drawable drawable = getResources().getDrawable(                                                R.drawable.hungry_1);                                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),                                                drawable.getIntrinsicHeight());                                ImageSpan imageSpan = new ImageSpan(drawable,                                                ImageSpan.ALIGN_BASELINE);                                ss.setSpan(imageSpan, 0, imgStr.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);                                int nowLocation = eText.getSelectionStart();                                //需要對nowLocation進行判斷以免出現越界異常。                                eText.getText().insert(nowLocation, ss);                                setSpanClickable();                                eText.getText().insert(spanEnd , "\n");                        }                });                               button2.setOnClickListener(new OnClickListener(){                        public void onClick(View v) {                                SpannableString ss = new SpannableString(imgStr);                                Drawable drawable = getResources().getDrawable(                                                R.drawable.bad_smelly);                                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),                                                drawable.getIntrinsicHeight());                                ImageSpan imageSpan = new ImageSpan(drawable,                                                ImageSpan.ALIGN_BASELINE);                                ss.setSpan(imageSpan, 0, imgStr.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);                                eText.append(ss);                                setSpanClickable();                                eText.append("\n");                        }                                        });                               button3.setOnClickListener(new OnClickListener() {                        @Override                        public void onClick(View v) {                                eText.append(Html.fromHtml("<img src=‘" + R.drawable.ohoh + "‘/>",                                                imageGetter, null));                                setSpanClickable();                        }                });        }                        private OnClickListener textListener = new OnClickListener() {                //此方法不靠譜                @Override                public void onClick(View v) {                        // 關閉軟鍵盤                        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);                        imm.hideSoftInputFromWindow(eText.getWindowToken(), 0);                                                Spanned s = eText.getText();                        ImageSpan[] imageSpans = s.getSpans(0, s.length(), ImageSpan.class);                        int selectionStart = eText.getSelectionStart();                        for (ImageSpan span : imageSpans) {                int start = s.getSpanStart(span);                int end = s.getSpanEnd(span);                                               if (selectionStart >= start && selectionStart < end)// 找到圖片                                {                                        Toast.makeText(getApplicationContext(), "找到圖片", Toast.LENGTH_SHORT).show();                                        return;                                }                        }                                                // 開啟軟鍵盤                        imm.showSoftInput(eText, 0);                }        };                        public void setSpanClickable() {                //此方法比較靠譜                Spanned s = eText.getText();                //setMovementMethod很重要,不然ClickableSpan無法擷取點擊事件。                eText.setMovementMethod(LinkMovementMethod.getInstance());                ImageSpan[] imageSpans = s.getSpans(0, s.length(), ImageSpan.class);                               for (ImageSpan span : imageSpans) {                        final String image_src = span.getSource();                        final int start = s.getSpanStart(span);                        final int end = s.getSpanEnd(span);                        spanEnd = end;                                                Log.i(TAG,"setSpanClickable , image_src = "+image_src+" , start = "+start+" , end = "+end);                        ClickableSpan click_span = new ClickableSpan() {                                @Override                                public void onClick(View widget) {                                        eText.setCursorVisible(false);                                        Log.i(TAG , "click_span , onClick , "+eText.getSelectionStart());                                        Toast.makeText(MainActivity.this,                                                        "Image Clicked " + image_src, Toast.LENGTH_SHORT)                                                        .show();                                }                        };                        ClickableSpan[] click_spans = s.getSpans(start, end,                                        ClickableSpan.class);                        Log.i(TAG,"click_spans.length = "+click_spans.length);                        if (click_spans.length != 0) {                                // remove all click spans                                for (ClickableSpan c_span : click_spans) {                                        ((Spannable) s).removeSpan(c_span);                                }                        }                        ((Spannable) s).setSpan(click_span, start, end,                                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);                        Log.i(TAG,"length = "+s.getSpans(start, end,ClickableSpan.class).length);                }        }        }

效果:

代碼:這裡

 

Android EditText中插入圖片並響應點擊事件

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.