zoukankan      html  css  js  c++  java
  • Android EditText中插入图片并响应点击事件

    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 , "
    ");
                            }
                    });
                   
                    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("
    ");
                            }
                            
                    });
                   
                    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);
                    }
            }
            
    }

    效果:

    截图.png

    代码:这里

  • 相关阅读:
    WCF Server Console
    Restart IIS With Powershell
    RestartService (recursively)
    Copy Files
    Stopping and Starting Dependent Services
    多线程同步控制 ManualResetEvent AutoResetEvent MSDN
    DTD 简介
    Using Powershell to Copy Files to Remote Computers
    Starting and Stopping Services (IIS 6.0)
    java中的NAN和INFINITY
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4262724.html
Copyright © 2011-2022 走看看