EditText插入图片并存取

在这里定义了两个Button按钮和一个EditText,插入图片的话,就是点击插入图片按钮然后从sd卡中选择一张图片出来。下面是实现代码:
首先是button的监听事件:

btn_insertImage.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent getImage = new Intent(Intent.ACTION_GET_CONTENT);
                getImage.addCategory(Intent.CATEGORY_OPENABLE);
                getImage.setType("image/*");
                startActivityForResult(getImage, 1);
            }
        });

来分析一下代码:
ACTION_GET_CONTENT是标准的Activity Action的一种,那什么是Activity Action呢,简单来说就是让用户选择一种特殊的数据并得到它。
ACTION_GET_CONTENT可以让用户在运行的程序中取得数据,例如取照片,当然这里的运行的程序指的是手机上的文件管理器之类的。
addCategory是要增加一个分类,增加一个什么分类呢?就是增加CATEGORY_OPENABLE,从字面意思值是增加一个可以打开的分类,也即是取得的uri要可以被ContentResolver解析,注意这里的分类即是执行的附加条件。
setType就是设置取得的数据类型为image,也即是取照片。
通过以上分析,可以知道我们定义了这样一个intent,要取得数据,取得数据要能够被打开,且类型为image,这样我们就可以执行了。

@Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent intent) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, intent);
        ContentResolver resolver = getContentResolver();
        if (resultCode == RESULT_OK) {
            if (requestCode == 1) {
                originalUri = intent.getData();
                try {
                    Bitmap originalBitmap = BitmapFactory.decodeStream(resolver
                            .openInputStream(originalUri));
                    bitmap = resizeImage(originalBitmap, 100, 100);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                if (bitmap != null) {
                    editText = (EditText) findViewById(R.id.edit);
                    insertIntoEditText(getBitmapMime(bitmap, originalUri));
                } else {
                    Toast.makeText(MainActivity.this, "获取图片失败",
                            Toast.LENGTH_SHORT).show();
                }
            }
        }
        if (bitmap != null) {
        }
    }

代码分析:
1.首先使用intent.getData得到uri
2.然后调用BitmapFactory的解码函数decodeStream且要求的参数为流(Stream),所以要用ContentResolver解析uri为流。
3.接着通过一个resizeImage函数重新调整bitmap大小,这里不再给出
4.然后就是要把所得到的图片放到EditText里了

private SpannableString getBitmapMime(Bitmap pic, Uri uri) {
        String path = uri.getPath();
        SpannableString ss = new SpannableString(path);
        ImageSpan span = new ImageSpan(this, pic);
        ss.setSpan(span, 0, path.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        return ss;
    }
private void insertIntoEditText(SpannableString ss) {
    Editable et = editText.getText();// 先获取Edittext中的内容
    int start = editText.getSelectionStart();
    et.insert(start, ss);// 设置ss要添加的位置
    editText.setText(et);// 把et添加到Edittext中
    editText.setSelection(start + ss.length());// 设置Edittext中光标在最后面显示
}

代码分析:
在getBitmapMime()中,首先建立一个SpannableString,r然后我们要给它附一张图片,这张图片来自我们的sd卡,然后是setSpan()函数,这里有4个参数,分别是要插入的对象,起始位置,终止位置,标记,在本程序里插入的对象为一张图片,起始位置为0,终止位置为path的长度,标记为会删除缓冲区里原有的text,这里即为path。
在insertIntoEditText()中,因为是动态添加,所以要用到Editable,然后先把ss添加到et里,然后在放到editText里,最后在设置一下光标的位置为最后
至此,插入图片完成

  1. 怎么保存图片?
    保存按钮的监听事件代码:
Button btn_save = (Button) findViewById(R.id.save);
        btn_save.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String content = editText.getText().toString();
                Bundle data = new Bundle();
                data.putString("nei", content);
                Intent intent = new Intent(MainActivity.this, Display.class);
                intent.putExtra("neirong", data);
                startActivity(intent);
            }
        });

代码分析:
代码非常简单,我们只需保存editText里面的内容转化成String存到content中,(注意:这里的图片会变为它的路径即为/mnt/sdcard/………这样的形式),
然后我们启动另外一个Activity,这里当然也可以保存content到数据库中。
至此,保存图片完成

  1. 怎么解析回图片和文字
    首先,我们有另外一个Activity,名字为display,注这里不在给图,因为view里只有一个EditText
EditText display;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.display);
    display = (EditText) findViewById(R.id.display);
    String imagePath = getIntent().getBundleExtra("neirong").getString(
            "nei");
    SpannableString ss = new SpannableString(imagePath);
    Pattern p=Pattern.compile("/mnt/sdcard/.+?\\.\\w{3}");
    Matcher m=p.matcher(imagePath);
    while(m.find()){
        Bitmap bm = BitmapFactory.decodeFile(m.group());
        Bitmap rbm = resizeImage(bm, 100, 100);
        ImageSpan span = new ImageSpan(this, rbm);
        ss.setSpan(span, m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
    display.setText(ss);
}

代码分析:
首先取出上一个Activity里面的内容,保存到imagePath中,接下来就是把imagePath中的图片改为图片即可,同样使用SpannableString,但怎么在一个很长的String中找到图片的路径呢,要使用正则表达式,这里是我写的一个正则表达式/mnt/sdcard/.+?\.\w{3},写的比较差,呵呵,通过正则表达式找到路径,就可以在BitmapFactory中找到图片,然后就可以利用setSpan()函数进行替换,最后在显示出来。
至此,解析回图片和文字完成

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值