Android EditText中添图片(Spanned)后的定位问题

来源:互联网 发布:笔记本电脑测评软件 编辑:程序博客网 时间:2024/04/30 03:10

由于项目需要上传图片和文本~遇到一些问题


Android EditText中可以使用Html.from()方式给 文本框添加图片,

但是这种方式在引用Html.from()返回的Spanned后,无法在Editable中找到。

百度许久没有找到~

debug了好久,发现,EditText只保留ImageSpan,即EditText不保留Html.from()返回的对象

而是保留了一个转后后的新对象。所以使用Editable.getSpanStart 方法无法找到。


由于时间不足,所以没有图片。希望对大家有所帮组


下面贴代码,一个简单的管理类:



public class EditUploadBitmapManager {

    List<String> bitmapPathList=new ArrayList<String>(); //图片路径
    List<Object> spannedList=new ArrayList<Object>();
    
    
//    http://blog.csdn.net/u010418593/article/details/9324101
    EditText editText;
//    ImageGetter imageGetter=new ImageGetter() {
//        
//        @Override
//        public Drawable getDrawable(String source) {
//            // TODO Auto-generated method stub
//            // 获取本地图片  
//            Drawable drawable = Drawable.createFromPath(source);  
//            // 必须设为图片的边际,不然TextView显示不出图片  
//            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  
//            // 将其返回  
//            return drawable;  
//        }
//    };
    public EditUploadBitmapManager(EditText editText) {
        super();
        this.editText = editText;
    }
    
    /**
     * 添加图片
     * @param bitpath
     */
    public void addbitmap(String bitpath){
        if(bitpath==null)
            return;
        int cursor=editText.getSelectionStart();
        
        Editable editable=editText.getText();
        SpannableString spannableString =new SpannableString(bitpath);
          
        Drawable drawable = Drawable.createFromPath(bitpath);  
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  
        
        //editable中只引用ImageSpan 需要创建一个ImageSpan替换到spannableString
        ImageSpan spanned=new ImageSpan(drawable);
      
        spannableString.setSpan(spanned, 0, bitpath.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        
        //添加ImageSpan 引用
        spannedList.add(spanned);
        
        editable.insert(cursor, spannableString);
        
        bitmapPathList.add(bitpath);
        
    }
    
    
    /**
     * 添加图片并换行
     * @param bitpath 文件路径
     */
    public void addbitmapln(String bitpath){
        if(bitpath==null)
            return;
        int cursor=editText.getSelectionStart();//光标位置
        
        Editable editable=editText.getText();
        
        
        SpannableString spannableString =new SpannableString(bitpath);
          
        Drawable drawable = Drawable.createFromPath(bitpath);  
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  
        
        //editable中只引用ImageSpan 需要创建一个ImageSpan替换到spannableString
        ImageSpan spanned=new ImageSpan(drawable);
        
        //其实为将spannableString中的文字换成图片显示
        spannableString.setSpan(spanned, 0, bitpath.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        
        //添加ImageSpan 引用
        spannedList.add(spanned);
        
        bitmapPathList.add(bitpath);
        
        editable.insert(cursor,"\n");
        //注意 editable 会将转换传入Span,所以引用传入的Span 无法在在后找出来,如Html.from()添加图片的方式无效
        editable.insert(cursor, spannableString);
        editable.insert(cursor,"\n");
        
        
        
        
        
    }
    
    
//    #--images-file_name--#
    

    /**
     * 根据占位符替换
     * @param bitpath
     */
    public void addbitmaplnBySize(String bitpath){
        if(bitpath==null)
            return;
        
        String str="#--images-"+getFileName(bitpath)+"--#";
        
        int cursor=editText.getSelectionStart();//光标位置
        
        Editable editable=editText.getText();
        
        
        SpannableString spannableString =new SpannableString(str);
          
        Drawable drawable = Drawable.createFromPath(bitpath);  
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  
        
        //editable中只引用ImageSpan 需要创建一个ImageSpan替换到spannableString
        ImageSpan spanned=new ImageSpan(drawable);
        
        //其实为将spannableString中的文字换成图片显示
        spannableString.setSpan(spanned, 0, str.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        
        //添加ImageSpan 引用
        spannedList.add(spanned);
        
        bitmapPathList.add(bitpath);
        
        editable.insert(cursor,"\n");
        //注意 editable 会将转换传入Span,所以引用传入的Span 无法在在后找出来,如Html.from()添加图片的方式无效
        editable.insert(cursor, spannableString);
        editable.insert(cursor,"\n");
        
        
        
    }
    
     public static String getFileName(String pathandname){  
         
            int start=pathandname.lastIndexOf("/");  
            int end=pathandname.lastIndexOf(".");  
            if(start!=-1 && end!=-1){  
                return pathandname.substring(start+1,end);    
            }else{  
                return null;  
            }  
              
        }
    
     /**
      * 上传检查,去掉被删除的Span引用
      */
    
    public void upLoadCheck(){
        
        Editable editable= editText.getText();
        
        for (int i = 0; i < spannedList.size()&&i>-1; i++) {
            //span被删除了
            if(editable.getSpanStart(spannedList.get(i))<0){
                if(i>=bitmapPathList.size())
                    break;
                bitmapPathList.remove(i);
                --i;
            }
            
        }
    }
    
    /**
     * 根据图片路径构造占位符,格式化文本
     */
    public void formatTextByUrl(ArrayList<String> bitpath){
        
        if(bitpath==null)
            return;
        Editable editable= editText.getText();
        for (int i = 0; i < bitpath.size(); i++) {
            String text=editable.toString();
            
            String bitname="#--images-"+getFileName(bitpath.get(i))+"--#";
            
            int start=text.indexOf(bitname);
            
            SpannableString spannableString=new SpannableString(bitname);
            
            Drawable drawable = Drawable.createFromPath(bitpath.get(i));  
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
            ImageSpan spanned=new ImageSpan(drawable);
            spannableString.setSpan(spanned, 0,bitname.length() , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            
            editable.replace(start, start+bitname.length(), spannableString);
        
        }
        
        
    }
    
    public List<String> getbitmapPathList() {
        return bitmapPathList;
    }

    public void setbitmapPathList(List<String> bitmapPathList) {
        this.bitmapPathList = bitmapPathList;
    }

    public EditText getEditText() {
        return editText;
    }

    public void setEditText(EditText editText) {
        this.editText = editText;
    }
    
    
}

0 0
原创粉丝点击