diff --git a/src/ui/NoteEditActivity.java b/src/ui/NoteEditActivity.java index 3ce63a7..6119667 100644 --- a/src/ui/NoteEditActivity.java +++ b/src/ui/NoteEditActivity.java @@ -35,6 +35,8 @@ import android.text.SpannableString; import android.text.TextUtils; import android.text.format.DateUtils; import android.text.style.BackgroundColorSpan; +import android.text.TextWatcher; +import android.text.Editable; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -73,7 +75,7 @@ import java.util.regex.Pattern; public class NoteEditActivity extends Activity implements OnClickListener, - NoteSettingChangedListener, OnTextViewChangeListener { + NoteSettingChangedListener, OnTextViewChangeListener,OnSelectionChangeListener { private class HeadViewHolder {//头视图持有者类??? public TextView tvModified;//文本修改 @@ -82,6 +84,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, public TextView tvAlertDate;//文本提醒日期? public ImageView ibSetBgColor;//设置背景颜色图像视图 + public TextView tvCharNum;//新增字符数显示控件 } private static final Map sBgSelectorBtnsMap = new HashMap();//背景颜色选择按钮映射 @@ -128,7 +131,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, private View mFontSizeSelector; - private EditText mNoteEditor; + private NoteEditText mNoteEditor; private View mNoteEditorPanel; @@ -148,6 +151,28 @@ public class NoteEditActivity extends Activity implements OnClickListener, private String mUserQuery; private Pattern mPattern; + //新增字符统计方法,排除空白字符 + //计算可见字符数,排除空白字符 + private int calcVisibleCharCount(CharSequence s) { + if (s == null) return 0; + String filtered = s.toString().replaceAll("\\s+", ""); + return filtered.length(); + } + //根据选区更新字符统计显示 + private void updateCharNumForSelection(CharSequence text, int selStart, int selEnd) { + if (text == null) { + mNoteHeaderHolder.tvCharNum.setText("字符数:0"); + return; + } + if (selStart == selEnd) { + mNoteHeaderHolder.tvCharNum.setText("字符数:" + calcVisibleCharCount(text)); + } else { + int min = Math.min(selStart, selEnd); + int max = Math.max(selStart, selEnd); + CharSequence sub = text.subSequence(min, max); + mNoteHeaderHolder.tvCharNum.setText("字符数:" + calcVisibleCharCount(sub)); + } + } @Override protected void onCreate(Bundle savedInstanceState) {//创建活动时调用 @@ -371,7 +396,28 @@ public class NoteEditActivity extends Activity implements OnClickListener, mNoteHeaderHolder.tvAlertDate = (TextView) findViewById(R.id.tv_alert_date); mNoteHeaderHolder.ibSetBgColor = (ImageView) findViewById(R.id.btn_set_bg_color); mNoteHeaderHolder.ibSetBgColor.setOnClickListener(this); - mNoteEditor = (EditText) findViewById(R.id.note_edit_view); + mNoteHeaderHolder.tvCharNum=(TextView)findViewById(R.id.tv_char_num);//将tvCharNum绑定到TextView + mNoteEditor = (NoteEditText) findViewById(R.id.note_edit_view); + // 注册选区变化监听 + mNoteEditor.setOnSelectionChangeListener(this); + //设置文本监听(统计时排除空白字符) + mNoteEditor.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + int displayCount = calcVisibleCharCount(s); + mNoteHeaderHolder.tvCharNum.setText("字符数:" + displayCount); + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + mNoteHeaderHolder.tvCharNum.setText("字符数:" + calcVisibleCharCount(mNoteEditor.getText())); + + mNoteEditorPanel = findViewById(R.id.sv_note_edit); mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector); for (int id : sBgSelectorBtnsMap.keySet()) { @@ -704,7 +750,10 @@ public class NoteEditActivity extends Activity implements OnClickListener, } } mEditTextList.addView(getListItem("", index));//添加一个空列表项 - mEditTextList.getChildAt(index).findViewById(R.id.et_edit_text).requestFocus();//将焦点自动切换到新添加的空列表项的编辑框 + View focused = mEditTextList.getChildAt(index); + focused.findViewById(R.id.et_edit_text).requestFocus(); + // 更新字符统计,显示整条便签的字符数 + mNoteHeaderHolder.tvCharNum.setText("字符数:" + calcVisibleCharCount(text)); mNoteEditor.setVisibility(View.GONE);//隐藏编辑框 mEditTextList.setVisibility(View.VISIBLE); @@ -753,10 +802,30 @@ public class NoteEditActivity extends Activity implements OnClickListener, } edit.setOnTextViewChangeListener(this); + //新增选区变化回调接口设置 + edit.setOnSelectionChangeListener(this); edit.setIndex(index); edit.setText(getHighlightQueryResult(item, mUserQuery)); return view; } + //新增选区变化回调接口实现 + + @Override + public void onSelectionChanged(int index, int selStart, int selEnd) { + if (mWorkingNote.getCheckListMode() == TextNote.MODE_CHECK_LIST) { + //列表模式下的选区变化事件 + if (index >= 0 && index < mEditTextList.getChildCount()) { + //如果索引在范围内 + View view = mEditTextList.getChildAt(index); + NoteEditText edit = (NoteEditText) view.findViewById(R.id.et_edit_text); + updateCharNumForSelection(edit.getText(), selStart, selEnd); + } + } else { + if (mNoteEditor != null && mNoteEditor.isFocused()) { + updateCharNumForSelection(mNoteEditor.getText(), selStart, selEnd); + } + } + } public void onTextChange(int index, boolean hasText) {// 列表项文本变化事件 if (index >= mEditTextList.getChildCount()) {//检查索引是否超出范围 @@ -781,6 +850,8 @@ public class NoteEditActivity extends Activity implements OnClickListener, mNoteEditor.setText(getHighlightQueryResult(mWorkingNote.getContent(), mUserQuery)); mEditTextList.setVisibility(View.GONE); mNoteEditor.setVisibility(View.VISIBLE); + // 更新字符统计为整条便签字符数 + mNoteHeaderHolder.tvCharNum.setText("字符数:" + calcVisibleCharCount(mWorkingNote.getContent())); } } diff --git a/src/ui/NoteEditText.java b/src/ui/NoteEditText.java index e0fe20a..b2ff0a0 100644 --- a/src/ui/NoteEditText.java +++ b/src/ui/NoteEditText.java @@ -86,6 +86,8 @@ public class NoteEditText extends EditText { } private OnTextViewChangeListener mOnTextViewChangeListener; // 文本变化监听器实例 + //新增选区变化回调接口 + private OnSelectionChangeListener mOnSelectionChangeListener; /** * 构造函数,创建NoteEditText实例 @@ -111,6 +113,10 @@ public class NoteEditText extends EditText { public void setOnTextViewChangeListener(OnTextViewChangeListener listener) { mOnTextViewChangeListener = listener; } + //新增选区变化回调接口设置方法 + public void setOnSelectionChangeListener(OnSelectionChangeListener listener) { + mOnSelectionChangeListener = listener; + } /** * 构造函数,从XML布局创建NoteEditText实例 @@ -285,4 +291,19 @@ public class NoteEditText extends EditText { } super.onCreateContextMenu(menu); } + + //新增选区变化回调接口实现 + @Override + protected void onSelectionChanged(int selStart, int selEnd) { + super.onSelectionChanged(selStart, selEnd); + if (mOnSelectionChangeListener != null) { + mOnSelectionChangeListener.onSelectionChanged(mIndex, selStart, selEnd); + } + } } + + +// 新增选区变化回调接口 +interface OnSelectionChangeListener { + void onSelectionChanged(int index, int selStart, int selEnd); +} \ No newline at end of file