From 6e883216eab955c5766ea45d2cd3c60a06baa534 Mon Sep 17 00:00:00 2001 From: xuningshuo <2105361900@qq.com> Date: Tue, 27 Jan 2026 00:55:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E9=A1=B5=E8=BE=B9?= =?UTF-8?q?=E8=B7=9D=E4=BD=BF=E5=BE=97ui=E4=B8=8D=E4=BC=9A=E9=81=AE?= =?UTF-8?q?=E6=8C=A1=E7=AC=AC=E4=B8=80=E8=A1=8C=E6=96=87=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- res/layout/note_edit.xml | 8 +++-- res/layout/note_edit_list_item.xml | 3 +- src/ui/NoteEditActivity.java | 11 ++++--- src/ui/NoteEditText.java | 50 +++++++++++++++++------------- 4 files changed, 43 insertions(+), 29 deletions(-) diff --git a/res/layout/note_edit.xml b/res/layout/note_edit.xml index 10b2aa7..a8b58b6 100644 --- a/res/layout/note_edit.xml +++ b/res/layout/note_edit.xml @@ -81,7 +81,9 @@ android:scrollbars="none" android:overScrollMode="never" android:layout_gravity="left|top" - android:fadingEdgeLength="0dip"> + android:fadingEdgeLength="0dip" + android:paddingTop="24dip" + android:clipToPadding="false"> + android:lineSpacingMultiplier="1.2" + android:paddingTop="12dip" + android:scrollHorizontally="false" /> + android:background="@null" + android:scrollHorizontally="false" /> diff --git a/src/ui/NoteEditActivity.java b/src/ui/NoteEditActivity.java index 0faa62e..6dc52b0 100644 --- a/src/ui/NoteEditActivity.java +++ b/src/ui/NoteEditActivity.java @@ -30,7 +30,6 @@ import android.view.WindowManager; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; -import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -45,6 +44,7 @@ import net.micode.notes.tool.DataUtils; import net.micode.notes.tool.ResourceParser; import net.micode.notes.tool.ResourceParser.TextAppearanceResources; import net.micode.notes.ui.DateTimePickerDialog.OnDateTimeSetListener; +import net.micode.notes.ui.NoteEditText; import net.micode.notes.ui.NoteEditText.OnTextViewChangeListener; import net.micode.notes.widget.NoteWidgetProvider_2x; import net.micode.notes.widget.NoteWidgetProvider_4x; @@ -118,7 +118,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, //私有化一个界面操作mNoteBgColorSelector,对背景颜色的操作 private View mFontSizeSelector; //私有化一个界面操作mFontSizeSelector,对标签字体的操作 - private EditText mNoteEditor; + private NoteEditText mNoteEditor; //声明编辑控件,对文本操作 private View mNoteEditorPanel; //私有化一个界面操作mNoteEditorPanel,文本编辑的控制板 @@ -212,7 +212,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, //setSoftInputMode——软键盘输入模式 getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN - | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); + | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); } else if(TextUtils.equals(Intent.ACTION_INSERT_OR_EDIT, intent.getAction())) { // intent.getAction() // 大多用于broadcast发送广播时给机制(intent)设置一个action,就是一个字符串 @@ -254,7 +254,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, }//创建一个新的WorkingNote getWindow().setSoftInputMode( - WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE + WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); } else { Log.e(TAG, "Intent not specified action, should not support"); @@ -384,7 +384,7 @@ 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); + mNoteEditor = (NoteEditText) findViewById(R.id.note_edit_view); mNoteEditorPanel = findViewById(R.id.sv_note_edit); mNoteBgColorSelector = findViewById(R.id.note_bg_color_selector); for (int id : sBgSelectorBtnsMap.keySet()) { @@ -408,6 +408,7 @@ public class NoteEditActivity extends Activity implements OnClickListener, mFontSizeId = ResourceParser.BG_DEFAULT_FONT_SIZE; } mEditTextList = (LinearLayout) findViewById(R.id.note_edit_list); + mNoteEditor.setOnTextViewChangeListener(this); } @Override diff --git a/src/ui/NoteEditText.java b/src/ui/NoteEditText.java index 0d97949..890ebec 100644 --- a/src/ui/NoteEditText.java +++ b/src/ui/NoteEditText.java @@ -95,14 +95,12 @@ public class NoteEditText extends androidx.appcompat.widget.AppCompatEditText { } @Override - //view里的函数,处理手机屏幕的所有事件 - /*参数event为手机屏幕触摸事件封装类的对象,其中封装了该事件的所有信息, - 例如触摸的位置、触摸的类型以及触摸的时间等。该对象会在用户触摸手机屏幕时被创建。*/ public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { - //重写了需要处理屏幕被按下的事件 case MotionEvent.ACTION_DOWN: - //跟新当前坐标值 + if (isInEditMode()) { + break; + } int x = (int) event.getX(); int y = (int) event.getY(); x -= getTotalPaddingLeft(); @@ -110,16 +108,14 @@ public class NoteEditText extends androidx.appcompat.widget.AppCompatEditText { x += getScrollX(); y += getScrollY(); - //用布局控件layout根据x,y的新值设置新的位置 Layout layout = getLayout(); - int line = layout.getLineForVertical(y); - int off = layout.getOffsetForHorizontal(line, x); - - //更新光标新的位置 - Selection.setSelection(getText(), off); + if (layout != null) { + int line = layout.getLineForVertical(y); + int off = layout.getOffsetForHorizontal(line, x); + Selection.setSelection(getText(), off); + } break; } - return super.onTouchEvent(event); } @@ -133,8 +129,12 @@ public class NoteEditText extends androidx.appcompat.widget.AppCompatEditText { //根据按键的 Unicode 编码值来处理 case KeyEvent.KEYCODE_ENTER: //“进入”按键 + // 检查是否是输入法的确认操作,如果是则不拦截 if (mOnTextViewChangeListener != null) { - return false; + if ((event.getFlags() & KeyEvent.FLAG_EDITOR_ACTION) == 0 && !isInEditMode()) { + // 允许事件正常传递给父类 + return super.onKeyDown(keyCode, event); + } } break; case KeyEvent.KEYCODE_DEL: @@ -173,14 +173,22 @@ public class NoteEditText extends androidx.appcompat.widget.AppCompatEditText { case KeyEvent.KEYCODE_ENTER: //同上也是分为监听器是否建立2种情况 if (mOnTextViewChangeListener != null) { - int selectionStart = getSelectionStart(); - //获取当前位置 - String text = getText().subSequence(selectionStart, length()).toString(); - //获取当前文本 - setText(getText().subSequence(0, selectionStart)); - //根据获取的文本设置当前文本 - mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text); - //当{@link KeyEvent#KEYCODE_ENTER}添加新文本 + // 检查是否是输入法的确认操作,如果是则不拦截 + // 同时检查是否有文本输入,避免拦截中文输入法选择候选词的操作 + if ((event.getFlags() & KeyEvent.FLAG_EDITOR_ACTION) == 0 && !isInEditMode() && event.getAction() == KeyEvent.ACTION_UP) { + // 只有当没有输入文本时才执行换行操作 + if (TextUtils.isEmpty(getText())) { + int selectionStart = getSelectionStart(); + //获取当前位置 + String text = getText().subSequence(selectionStart, length()).toString(); + //获取当前文本 + setText(getText().subSequence(0, selectionStart)); + //根据获取的文本设置当前文本 + mOnTextViewChangeListener.onEditTextEnter(mIndex + 1, text); + //当{@link KeyEvent#KEYCODE_ENTER}添加新文本 + return true; + } + } } else { Log.d(TAG, "OnTextViewChangeListener was not seted"); //其他情况报错,文档的改动监听器并没有建立 -- 2.34.1