尊重原创,转载请注明出处,原文地址: http://blog.csdn.net/qq137722697
另一个富文本编辑器:https://github.com/huangdali/HRichEditor
1、什么是MRichEditor
MRichEditor是一款Android开源轻量级的富文本编辑器,它可以根据用户最终撰写的文章创建出对应的html文件。
2、可以撰写哪些内容
目前支持用户撰写标题、内容、图片(选择相册、拍照都可以),即可以根据用户的需要进行图文混排,支持对内容的添加、删除、修改。
用户撰写图文混排的内容——>生成HTML文件——>开发者拿到HTML想干嘛就干嘛。
3、关于配置
开发者只需要简单的配置几行代码就可以实现,它还提供了近40个接口用于开发者自己定制相应的内容,它预留了一个便于开发者扩展功能的按钮,可以定制显示文本、图片以及监听单击事件。
4、关于兼容性
兼容Android2.3——>Android6.0系统的机型。
5、效果展示
这是使用MRichEditor编写的文章
1、gradle添加依赖
compile 'com.huangdali:mricheditor:1.0.1'
2、权限
<uses-permission android:name&#61;"android.permission.CAMERA" />
<uses-permission android:name&#61;"android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name&#61;"android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name&#61;"android.permission.INTERNET" />
3、在布局文件中使用
<com.hdl.mricheditor.view.MRichEditorandroid:id&#61;"&#64;&#43;id/mre_editor"android:layout_width&#61;"match_parent"android:layout_height&#61;"match_parent">com.hdl.mricheditor.view.MRichEditor>
4、重写onActivityResult方法
在使用MRichEditor的Activity/Fragment中重写onActivityResult方法&#xff08;直接复制即可&#xff09;。
/*** 需要重写这个方法选择图片、拍照才有用哦** &#64;param requestCode* &#64;param resultCode* &#64;param data*/
&#64;Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode &#61;&#61; RESULT_CANCELED) {Toast.makeText(this, "取消操作", Toast.LENGTH_LONG).show();return;}if (requestCode &#61;&#61; CamaraRequestCode.CAMARA_GET_IMG) {editor.insertImg(data.getData());} else if (requestCode &#61;&#61; CamaraRequestCode.CAMARA_TAKE_PHOTO) {editor.insertImg(data);}
}
1、来个最简单的demo
先看效果图&#xff0c;添加标题、内容、图片&#xff0c;修改内容&#xff0c;预览&#xff1a;
由于模拟器不支持拍照&#xff0c;所以没有演示拍照功能&#xff0c;你自己可以根据上面的步骤简单配置一下就可以看到效果了。
修改&#xff08;单击&#xff09;、删除&#xff08;长按&#xff09;&#xff1a;
上代码&#xff0c;代码里面有注释就不一一解释了&#xff1a;
public class MainActivity extends AppCompatActivity {private MRichEditor editor;&#64;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editor &#61; (MRichEditor) findViewById(R.id.mre_editor);editor.setServerImgDir("http://192.168.0.107:8080/UpLoadDemo/upload");//设置图片存放在服务器的路径}/*** 需要重写这个方法选择图片、拍照才有用哦** &#64;param requestCode* &#64;param resultCode* &#64;param data*/&#64;Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode &#61;&#61; RESULT_CANCELED) {Toast.makeText(this, "取消操作", Toast.LENGTH_LONG).show();return;}if (requestCode &#61;&#61; CamaraRequestCode.CAMARA_GET_IMG) {editor.insertImg(data.getData());} else if (requestCode &#61;&#61; CamaraRequestCode.CAMARA_TAKE_PHOTO) {editor.insertImg(data);}}/*** 完成** &#64;param view*/public void onFinished(View view) {String htmlStr &#61; editor.createHtmlStr();Log.e("htmlStr", htmlStr);}
}
最终logcat中会打印创建的html内容&#xff08;有点长&#xff0c;就不贴出来了&#xff09;。
2、进阶Demo
同样的先看效果图&#xff1a;
上代码&#xff08;这里对Android6.0的手机进行了权限的适配&#xff0c;Android6.0动态权限相关类在这里下载&#xff08;点我&#xff09;&#xff0c;可以去GitHub中下载&#xff08;点我&#xff09;&#xff0c;里面使用到的多文件上传框架是可以在我的另外一篇博客查看详细信息&#xff08;点我&#xff09;&#xff09;&#xff1a;
public class MainActivity extends AppCompatActivity {private MRichEditor editor;//编辑器private EditText etTitle;//文章标题对象private static final String BASE_URL &#61; "http://192.168.2.153:8080/MRichEditorDemoServer/upload.action";//文件上传的接口private static final String IMG_URL &#61; "http://192.168.2.153:8080/MRichEditorDemoServer/upload";//文件存放的路径&#64;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*** 请求所有必要的权限----android6.0必须要动态申请权限,否则选择照片和拍照功能 用不了哦*/PermissionsManager.getInstance().requestAllManifestPermissionsIfNecessary(this, new PermissionsResultAction() {&#64;Overridepublic void onGranted() {//权限通过了}&#64;Overridepublic void onDenied(String permission) {//权限拒绝了}});initMRichEditor();//初始化编辑器}/*** 初始化富文本编辑器*/private void initMRichEditor() {etTitle &#61; (EditText) findViewById(R.id.et_main_title);editor &#61; (MRichEditor) findViewById(R.id.mre_editor);editor.setServerImgDir(IMG_URL);//设置图片存放的路径editor.setOnPreviewBtnClickListener(new View.OnClickListener() {&#64;Overridepublic void onClick(View v) {priview();//预览}});}/*** 预览*/private void priview() {editor.setHtmlTitle(etTitle.getText().toString().trim());//设置html的标题String htmlStr &#61; editor.createHtmlStr();//创建html字符串AlertDialog dialog &#61; null;AlertDialog.Builder builder &#61; new AlertDialog.Builder(MainActivity.this);View view &#61; View.inflate(MainActivity.this, R.layout.dialog_preiview_html, null);final WebView wvPreiview &#61; (WebView) view.findViewById(R.id.wv_dialog_preiview_html);ImageView ivClose &#61; (ImageView) view.findViewById(R.id.iv_dialog_close);ImageView ivRefresh &#61; (ImageView) view.findViewById(R.id.iv_dialog_refresh);ivRefresh.setOnClickListener(new View.OnClickListener() {&#64;Overridepublic void onClick(View v) {wvPreiview.reload();}});wvPreiview.loadData(htmlStr, "text/html; charset&#61;UTF-8", null);builder.setView(view);dialog &#61; builder.create();dialog.show();final AlertDialog finalDialog &#61; dialog;ivClose.setOnClickListener(new View.OnClickListener() {&#64;Overridepublic void onClick(View v) {finalDialog.dismiss();}});uploadImg();//上传图片}/*** 需要重写这个方法,并且加上下面的判断(照写即可)** &#64;param requestCode* &#64;param resultCode* &#64;param data*/&#64;Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode &#61;&#61; RESULT_CANCELED) {Toast.makeText(this, "取消操作", Toast.LENGTH_LONG).show();return;}if (requestCode &#61;&#61; CamaraRequestCode.CAMARA_GET_IMG) {editor.insertImg(data.getData());} else if (requestCode &#61;&#61; CamaraRequestCode.CAMARA_TAKE_PHOTO) {editor.insertImg(data);}}/*** 完成按钮---将文件和图片提交到服务器** &#64;param view*/public void onFinished(View view) {editor.setHtmlTitle(etTitle.getText().toString().trim());//设置html的标题,在创建html文件之前,需要将文章的标题(即title标签)设置进去,之后设置无效.editor.createHtmlStr();//创建html字符串,会返回一个html字符串.[必须调用,否则内容为空]File file &#61; editor.getHtmlFile("sdcard/test.html");//创建html文件,并设置保存的路径//添加List
}
1、创建html字符串&#xff08;内容&#xff09;&#xff0c;返回String类型的内容
String createHtmlStr()
2、插入图片
void insertImg() //无参插入图片
void insertImg(Intent data) //带意图的插入图片
void insertImg(Uri bitmapUri) //带图片uri地址的插入图片
3、获取输入对话框&#xff08;对外提供修改dialog颜色的接口&#xff09;&#xff0c;返回InputDialog输入框对象。
InputDialog getDialog()
4、获取Html字符串&#xff08;内容&#xff09;
String getHtmlStr()//必须在createHtmlStr()之后调用哦
5、获取Html文件&#xff0c;需传入html文件保存路径&#xff08;你自己设置保存在哪里&#xff09;&#xff0c;返回html文件对象
File getHtmlFile(String filePath)
6、获取Html文件的输入流&#xff08;读取流&#xff09;对象&#xff0c;返回InputStream对象
InputStream getHtmlStream()
7、获取所有已经添加了的图片&#xff0c;返回图片列表
List<String> getImgPath()
8、获取所有添加的内容&#xff08;包括内容标题、内容、图片&#xff09; 返回添加的单条消息的列表
List<EditorBean> getEditorList()
9、设置内容字体的大小&#xff08;默认16&#xff09;
void setContentSize(int size)
10、设置内容字体的颜色&#xff08;默认灰色&#xff09;
void setContentColor(int color)//int值的颜色&#xff0c;比如Color.RED、Color.pares("#FF0000");
void setContentColor(String color)//String值的颜色&#xff08;不可缩写&#xff09;&#xff0c;比如#FF0000
11、设置标题的字体大小&#xff08;默认18&#xff09;
void setTitleSize(int size)
12、设置标题的字体的颜色&#xff08;默认为黑色&#xff09;
void setTitleColor(int color)//int值的颜色&#xff0c;比如Color.RED、Color.pares("#FF0000");
void setTitleColor(String color)//String值的颜色&#xff08;不可缩写&#xff09;&#xff0c;比如#FF0000
13、设置图片存放在服务器的位置
void setServerImgDir(String baseImgUrl)
14、设置Html的标题&#xff0c;即设置html文件中title标签的值
void setHtmlTitle(String htmlTitle)
15、设置预览按钮显示的文本&#xff08;预览按钮是作为一个扩展按钮来设计的&#xff0c;文本&#xff0c;图片&#xff0c;监听都可以自己来处理&#xff0c;不需要的还可以隐藏&#xff09;
void setSaveBtnText(CharSequence text)&#xff1b;//当时在写代码的时候忘记修改方法名了&#xff0c;将就用&#xff0c;这就是设置预览按钮显示的文本的方法
16、设置预览按钮的图片
void setPreviewBtnImageResource(Drawable drawable)
17、设置监听预览按钮的单击时间
void setOnPreviewBtnClickListener(OnClickListener clickListener)
18、设置预览按钮是否可见
void setPreviewBtnVisibility(int visibility)//传入这三个值View.VISIBLE可见&#xff08;默认&#xff09; View.GONE&#xff08;隐藏、并不占位置&#xff09; View.INVISIBLE&#xff08;隐藏&#xff0c;但还在原来的位置&#xff09;。
19、设置图片保存的质量&#xff0c;百分制。默认为20&#xff0c;即图片压缩了80%&#xff08;这个值很合适&#xff0c;对于目前主流机型拍照压缩下来大概100k-300k大小&#xff09;。
void setImgQuality(int imgQuality)//imgQuality百分制
20、设置Html标题的类型
void setTitleType(TitleType titleType)//TitleType 对应html中标题标签即h1 h2 h3 ...h6
源码及demo下载地址&#xff1a;https://github.com/huangdali/mricheditordemo&#xff08;欢迎star&#xff09;
访问我的博客主页了解更多知识&#xff1a;http://blog.csdn.net/qq137722697
访问我的github主页了解更多开源框架&#xff1a;https://github.com/huangdali