关于Android(安卓)EditText图文混排的总结
写在前面:
作为一个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 ); } }); |
来分析一下代码:
-
ACTION_GET_CONTENT是标准的ActivityAction的一种,那什么是ActivityAction呢,简单来说就是让用户选择一种特殊的数据并得到它。
-
ACTION_GET_CONTENT可以让用户在运行的程序中取得数据,例如取照片,当然这里的运行的程序指的是手机上的文件管理器之类的。
-
addCategory是要增加一个分类,增加一个什么分类呢?就是增加CATEGORY_OPENABLE,从字面意思值是增加一个可以打开的分类,也即是取得的uri要可以被ContentResolver解析,注意这里的分类即是执行的附加条件。
-
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中光标在最后面显示 } |
代码分析:
-
在getBitmapMime()中,首先建立一个SpannableString,r然后我们要给它附一张图片,这张图片来自我们的sd卡,然后是setSpan()函数,这里有4个参数,分别是要插入的对象,起始位置,终止位置,标记,在本程序里插入的对象为一张图片,起始位置为0,终止位置为path的长度,标记为会删除缓冲区里原有的text,这里即为path。
-
在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()函数进行替换,最后在显示出来。
至此,解析回图片和文字完成
终于写完了,第一次写博客,排版和文字都不太好,慢慢改进吧!
更多相关文章
- 如何确定Android中刚修改后的c/c++是否编译成功
- Android使用huffman编码进行图片压缩
- Gradle Kotlin DSL , 你知道它吗?
- Android图片缓存分析(一)
- Android中图片的三级缓存策略
- Android小项目——社交类app(低仿微信)
- Android:调用系统图库/裁剪图片
- 第一行代码笔记3
- Android(安卓)CheckBox 修改选择框