十日冲刺(DAY8)
第八天
package com.example.myactivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import com.example.myactivity.comm.GlideSimpleLoader;
import com.example.myactivity.view.imagewatcher.ImageWatcherHelper;
import com.example.myactivity.ui.BaseActivity;
import com.example.myactivity.db.bean.Group;
import com.example.myactivity.db.bean.Note;
//import com.example.myactivity.comm.GlideSimpleLoader;
import com.example.myactivity.db.GroupDao;
import com.example.myactivity.util.CommonUtil;
import com.example.myactivity.util.ImageUtils;
import com.example.myactivity.util.StringUtils;
//import com.github.ielse.imagewatcher.ImageWatcherHelper;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import java.util.ArrayList;
import java.util.List;
import androidx.appcompat.widget.Toolbar;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
public class NoteActivity extends BaseActivity {
private static final String TAG = "NoteActivity";
private RichTextView tv_note_content;
//private ScrollView scroll_view;
private Note note;
private String myTitle;
private String myContent;
private String myGroupName;
private ProgressDialog loadingDialog;
private Disposable mDisposable;
private ImageWatcherHelper iwHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_note);
initView();
}
private void initView() {
Toolbar toolbar = findViewById(R.id.toolbar_note);
toolbar.setTitle("详情");
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
//toolbar.setNavigationIcon(R.drawable.ic_dialog_info);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
FloatingActionButton fab = findViewById(R.id.fab_note);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
iwHelper = ImageWatcherHelper.with(this, new GlideSimpleLoader());
GroupDao groupDao = new GroupDao(this);
loadingDialog = new ProgressDialog(this);
loadingDialog.setMessage("数据加载中...");
loadingDialog.setCanceledOnTouchOutside(false);
loadingDialog.show();
//标题
TextView tv_note_title = findViewById(R.id.tv_note_title);//标题
tv_note_title.setTextIsSelectable(true);
tv_note_content = findViewById(R.id.tv_note_content);//内容
//创建时间
TextView tv_note_time = findViewById(R.id.tv_note_time);
//选择分类
TextView tv_note_group = findViewById(R.id.tv_note_group);
try {
Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("data");
note = (Note) bundle.getSerializable("note");
if (note != null) {
myTitle = note.getTitle();
myContent = note.getContent();
Group group = groupDao.queryGroupById(note.getGroupId());
if (group != null) {
myGroupName = group.getName();
tv_note_group.setText(myGroupName);
}
tv_note_title.setText(myTitle);
tv_note_content.post(new Runnable() {
@Override
public void run() {
dealWithContent();
}
});
tv_note_time.setText(note.getCreateTime());
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void dealWithContent(){
//showEditData(myContent);
tv_note_content.clearAllLayout();
showDataSync(myContent);
// 图片点击事件
tv_note_content.setOnRtImageClickListener(new RichTextView.OnRtImageClickListener() {
@Override
public void onRtImageClick(View view, String imagePath) {
try {
ArrayList<String> imageList = StringUtils.getTextFromHtml(myContent, true);
int currentPosition = imageList.indexOf(imagePath);
showToast("点击图片:"+currentPosition+":"+imagePath);
List<Uri> dataList = new ArrayList<>();
for (int i = 0; i < imageList.size(); i++) {
dataList.add(ImageUtils.getUriFromPath(imageList.get(i)));
}
iwHelper.show(dataList, currentPosition);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* 异步方式显示数据
*/
private void showDataSync(final String html){
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) {
showEditData(emitter, html);
}
})
//.onBackpressureBuffer()
.subscribeOn(Schedulers.io())//生产事件在io
.observeOn(AndroidSchedulers.mainThread())//消费事件在UI线程
.subscribe(new Observer<String>() {
@Override
public void onComplete() {
if (loadingDialog != null){
loadingDialog.dismiss();
}
}
@Override
public void onError(Throwable e) {
if (loadingDialog != null){
loadingDialog.dismiss();
}
showToast("解析错误:图片不存在或已损坏");
Log.e(TAG, "onError: " + e.getMessage());
}
@Override
public void onSubscribe(Disposable d) {
mDisposable = d;
}
@Override
public void onNext(String text) {
try {
if (tv_note_content !=null) {
if (text.contains("<img") && text.contains("src=")) {
//imagePath可能是本地路径,也可能是网络地址
String imagePath = StringUtils.getImgSrc(text);
tv_note_content.addImageViewAtIndex(tv_note_content.getLastIndex(), imagePath);
} else {
tv_note_content.addTextViewAtIndex(tv_note_content.getLastIndex(), text);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* 显示数据
*/
private void showEditData(ObservableEmitter<String> emitter, String html) {
try {
List<String> textList = StringUtils.cutStringByImgTag(html);
for (int i = 0; i < textList.size(); i++) {
String text = textList.get(i);
emitter.onNext(text);
}
emitter.onComplete();
} catch (Exception e){
e.printStackTrace();
emitter.onError(e);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_note, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.action_note_edit://编辑日记
Intent intent = new Intent(NoteActivity.this, NewActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("note", note);
intent.putExtra("data", bundle);
intent.putExtra("flag", 1);//编辑日记
startActivity(intent);
finish();
break;
case R.id.action_note_share://分享日记
CommonUtil.shareTextAndImage(this, note.getTitle(), note.getContent(), null);//分享图文
break;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onStop() {
super.onStop();
if (mDisposable != null && !mDisposable.isDisposed()){
mDisposable.dispose();
}
}
@Override
public void onBackPressed() {
if (!iwHelper.handleBackPressed()) {
super.onBackPressed();
}
finish();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2023-05-04 c++打卡练习(20)