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

    代码:这里

  • 相关阅读:
    复杂声明的正确解读(*、()、[])
    (多张图片打包为Zip返回前端下载) 记NetCore HttpClient.GetStreamAsync()返回只读流,Stream的Length属性不可用,报错的问题。
    ### Vue开发环境搭建
    计算机网络原理----CRC编码相关问题及解题思路
    CentOS7安装MongoDB4.4.4
    树莓派4B安装.NET Core 3.1 SDK
    基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.0.0版)
    解决Unity启动报错 Assertion failed on expression: 'SUCCEEDED(hr)'
    @RabbitListener注解导致spring bean注入属性为空 解决方案
    一文彻底讲透@Async注解的原理和使用方法
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4262724.html
Copyright © 2011-2022 走看看