写在前面:

作为一个android爱好者,入门有一个月的时间了,在这一个月中自己编过一个小软件,感觉还不错。遇到的问题也挺多的,基本上都是从网上找答案,虽然说网上的答案总体上能解决自己的问题,但总有一些细节让人感觉摸不着头脑。

我遇到的问题很多,但一直没有进行总结,导致以后再遇到同样的问题也不能很快的解决,我感觉博客是个好手段,能够让自己学会总结。

开始:

下面就具体说一下我遇到的问题,首先是EditText里面的图文混排问题,这个问题的难点就是三点:

1.怎么插图片

2.怎么保存插入的图片和文字

3.怎么解析回图片和文字

解决方法:

1.怎么插入图片

通过一个自己写的具体的界面来说:

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

首先是button的监听事件:

1 2 3 4 5 6 7 8 9 10 btn_insertImage.setOnClickListener( new OnClickListener(){ @Override public void onClick(Viewv){ //TODOAuto-generatedmethodstub IntentgetImage= new Intent(Intent.ACTION_GET_CONTENT); getImage.addCategory(Intent.CATEGORY_OPENABLE); getImage.setType( "image/*" ); startActivityForResult(getImage, 1 ); } });

来分析一下代码:

  1. ACTION_GET_CONTENT是标准的ActivityAction的一种,那什么是ActivityAction呢,简单来说就是让用户选择一种特殊的数据并得到它。

  2. ACTION_GET_CONTENT可以让用户在运行的程序中取得数据,例如取照片,当然这里的运行的程序指的是手机上的文件管理器之类的。

  3. addCategory是要增加一个分类,增加一个什么分类呢?就是增加CATEGORY_OPENABLE,从字面意思值是增加一个可以打开的分类,也即是取得的uri要可以被ContentResolver解析,注意这里的分类即是执行的附加条件。

  4. setType就是设置取得的数据类型为image,也即是取照片。

通过以上分析,可以知道我们定义了这样一个intent,要取得数据,取得数据要能够被打开,且类型为image,这样我们就可以执行了。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 @Override protected void onActivityResult( int requestCode, int resultCode, Intentintent){ //TODOAuto-generatedmethodstub super .onActivityResult(requestCode,resultCode,intent); ContentResolverresolver=getContentResolver(); if (resultCode==RESULT_OK){ if (requestCode== 1 ){ originalUri=intent.getData(); try { BitmaporiginalBitmap=BitmapFactory.decodeStream(resolver .openInputStream(originalUri)); bitmap=resizeImage(originalBitmap, 100 , 100 ); } catch (FileNotFoundExceptione){ 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里了


1 2 3 4 5 6 7 private SpannableStringgetBitmapMime(Bitmappic,Uriuri){ Stringpath=uri.getPath(); SpannableStringss= new SpannableString(path); ImageSpanspan= new ImageSpan( this ,pic); ss.setSpan(span, 0 ,path.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); return ss; }
1 2 3 4 5 6 7 private void insertIntoEditText(SpannableStringss){ Editableet=editText.getText(); //先获取Edittext中的内容 int start=editText.getSelectionStart(); et.insert(start,ss); //设置ss要添加的位置 editText.setText(et); //把et添加到Edittext中 editText.setSelection(start+ss.length()); //设置Edittext中光标在最后面显示 }

代码分析:

  1. 在getBitmapMime()中,首先建立一个SpannableString,r然后我们要给它附一张图片,这张图片来自我们的sd卡,然后是setSpan()函数,这里有4个参数,分别是要插入的对象,起始位置,终止位置,标记,在本程序里插入的对象为一张图片,起始位置为0,终止位置为path的长度,标记为会删除缓冲区里原有的text,这里即为path。

  2. 在insertIntoEditText()中,因为是动态添加,所以要用到Editable,然后先把ss添加到et里,然后在放到editText里,最后在设置一下光标的位置为最后

至此,插入图片完成


2.怎么保存图片?

保存按钮的监听事件代码:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 Buttonbtn_save=(Button)findViewById(R.id.save); btn_save.setOnClickListener( new OnClickListener(){ @Override public void onClick(Viewv){ //TODOAuto-generatedmethodstub Stringcontent=editText.getText().toString(); Bundledata= new Bundle(); data.putString( "nei" ,content); Intentintent= new Intent(MainActivity. this ,Display. class ); intent.putExtra( "neirong" ,data); startActivity(intent); } });

代码分析:

代码非常简单,我们只需保存editText里面的内容转化成String存到content中,(注意:这里的图片会变为它的路径即为/mnt/sdcard/.........这样的形式),

然后我们启动另外一个Activity,这里当然也可以保存content到数据库中。

至此,保存图片完成


3.怎么解析回图片和文字

首先,我们有另外一个Activity,名字为display,注这里不在给图,因为view里只有一个EditText

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 EditTextdisplay; @Override protected void onCreate(BundlesavedInstanceState){ //TODOAuto-generatedmethodstub super .onCreate(savedInstanceState); setContentView(R.layout.display); display=(EditText)findViewById(R.id.display); StringimagePath=getIntent().getBundleExtra( "neirong" ).getString( "nei" ); SpannableStringss= new SpannableString(imagePath); Patternp=Pattern.compile( "/mnt/sdcard/.+?\\.\\w{3}" ); Matcherm=p.matcher(imagePath); while (m.find()){ Bitmapbm=BitmapFactory.decodeFile(m.group()); Bitmaprbm=resizeImage(bm, 100 , 100 ); ImageSpanspan= 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()函数进行替换,最后在显示出来。

至此,解析回图片和文字完成


终于写完了,第一次写博客,排版和文字都不太好,慢慢改进吧!

更多相关文章

  1. 如何确定Android中刚修改后的c/c++是否编译成功
  2. Android使用huffman编码进行图片压缩
  3. Gradle Kotlin DSL , 你知道它吗?
  4. Android图片缓存分析(一)
  5. Android中图片的三级缓存策略
  6. Android小项目——社交类app(低仿微信)
  7. Android:调用系统图库/裁剪图片
  8. 第一行代码笔记3
  9. Android(安卓)CheckBox 修改选择框

随机推荐

  1. android完全退出程序
  2. android 手势识别(一)
  3. 安卓添加全局字体tff
  4. Jquery 判断是否 移动设备 浏览
  5. Android(安卓)短信验证码自动填写
  6. android tabhost学习
  7. Android判断app是否打开消息通知并跳转设
  8. Android(安卓)zip文件压缩解压缩
  9. Android(安卓)在Activity中获取控件尺寸
  10. android:软件的安装和卸载源代码