1010import android .graphics .PorterDuff ;
1111import android .graphics .Typeface ;
1212import android .graphics .drawable .Drawable ;
13+ import android .os .Build ;
1314import android .text .Editable ;
1415import android .text .SpannableString ;
1516import android .text .Spanned ;
1617import android .text .TextUtils ;
1718import android .text .TextWatcher ;
1819import android .util .DisplayMetrics ;
1920import android .util .Log ;
21+ import android .view .ActionMode ;
2022import android .view .Gravity ;
23+ import android .view .Menu ;
24+ import android .view .MenuItem ;
2125import android .view .inputmethod .InputMethodManager ;
2226import android .widget .LinearLayout ;
2327import android .widget .ScrollView ;
@@ -52,7 +56,7 @@ public class VariableTextInput extends LinearLayout {
5256
5357 private Context mContext ;
5458 private SpannableString mSpannableString ;
55-
59+ private Editable mEditable ;
5660 public VariableTextInput (Context context ) {
5761 super (context );
5862 this .mContext = context ;
@@ -150,39 +154,85 @@ public void afterTextChanged(Editable s) {
150154 editText .setOnMenuItemCallBack (new VariableEditText .OnMenuItemCallBack () {
151155 @ Override
152156 public void onCut () {
153- handleClipBoardData ();
157+ handleClipBoardData (handleSelectData ());
158+ if (editText .getText () != null ) {
159+ editText .getText ().delete (editText .getSelectionStart (), editText .getSelectionEnd ());
160+ }
154161 }
155162
156163 @ Override
157164 public void onCopy () {
158- handleClipBoardData ();
165+ handleClipBoardData (handleSelectData () );
159166 }
160167
161168 @ Override
162169 public void onPaste () {
163- Log .e ("onPaste" , "执行onPaste方法" );
170+ // Log.e("onPaste", "执行onPaste方法--->" + mEditable);
171+ if (editText .getText () != null && mEditable != null ) {
172+ editText .getText ().insert (editText .getSelectionStart (), mEditable );
173+ }
164174 }
165175 });
176+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .M ) {
177+ editText .setCustomSelectionActionModeCallback (new ActionMode .Callback () {
178+ @ Override
179+ public boolean onCreateActionMode (ActionMode actionMode , Menu menu ) {
180+ int size = menu .size ();
181+ for (int i = size - 1 ; i >= 0 ; i --) {
182+ int itemId = menu .getItem (i ).getItemId ();
183+ if (itemId != android .R .id .cut && itemId != android .R .id .copy
184+ && itemId != android .R .id .selectAll && itemId != android .R .id .paste ) {
185+ menu .removeItem (itemId );
186+ }
187+ }
188+ return true ;
189+ }
190+
191+ @ Override
192+ public boolean onPrepareActionMode (ActionMode actionMode , Menu menu ) {
193+ return false ;
194+ }
195+
196+ @ Override
197+ public boolean onActionItemClicked (ActionMode actionMode , MenuItem menuItem ) {
198+ return false ;
199+ }
200+
201+ @ Override
202+ public void onDestroyActionMode (ActionMode actionMode ) {
203+
204+ }
205+ });
206+ }
166207 }
167208
168- //处理粘贴板数据
169- private void handleClipBoardData () {
170- ClipboardManager clipboardManager = (ClipboardManager ) mContext .getSystemService (Context .CLIPBOARD_SERVICE );
171- if (clipboardManager != null && editText .getText () != null ) {
172- Editable editable = Editable .Factory .getInstance ().newEditable (editText .getText ().subSequence (editText .getSelectionStart (), editText .getSelectionEnd ()));
173- TextSpan [] spans = editable .getSpans (0 , editable .length (), TextSpan .class );
174- if (spans == null || spans .length == 0 ) return ;
209+ private Editable handleSelectData () {
210+ if (editText .getText () != null ) {
211+ mEditable = Editable .Factory .getInstance ().newEditable (editText .getText ().subSequence (editText .getSelectionStart (), editText .getSelectionEnd ()));
212+ TextSpan [] spans = mEditable .getSpans (0 , mEditable .length (), TextSpan .class );
213+ if (spans == null || spans .length == 0 ) return null ;
175214 for (TextSpan span : spans ) {
176215 String text = span .getRichTextBean ().tag ;
177216 if (!TextUtils .isEmpty (span .getRichTextBean ().name )) {
178217 text = span .getRichTextBean ().tag + span .getRichTextBean ().name ;
179218 }
180- int startIndex = editable .getSpanStart (span );
181- int endIndex = editable .getSpanEnd (span );
182- editable .replace (startIndex , endIndex , text );
219+ int startIndex = mEditable .getSpanStart (span );
220+ int endIndex = mEditable .getSpanEnd (span );
221+ mEditable .replace (startIndex , endIndex , text );
222+ }
223+ return mEditable ;
224+ }
225+ return null ;
226+ }
227+
228+ //处理粘贴板数据
229+ private void handleClipBoardData (Editable editable ) {
230+ if (editable != null && editable .length () > 0 ) {
231+ ClipboardManager clipboardManager = (ClipboardManager ) mContext .getSystemService (Context .CLIPBOARD_SERVICE );
232+ if (clipboardManager != null ) {
233+ ClipData clipData = ClipData .newPlainText ("text" , editable );
234+ clipboardManager .setPrimaryClip (clipData );
183235 }
184- ClipData clipData = ClipData .newPlainText ("text" , editable );
185- clipboardManager .setPrimaryClip (clipData );
186236 }
187237 }
188238
@@ -433,9 +483,7 @@ private RichTextBean handleParams(ReadableMap map) {
433483
434484 public void insertEmoji (RichTextBean richTextBean ) {
435485 int startIndex = editText .getSelectionStart ();
436- Log .e ("startIndex" , startIndex + "" );
437486 int endIndex = startIndex + richTextBean .tag .length ();
438- Log .e ("endIndex" , endIndex + "" );
439487 if (editText .getText () != null ) {
440488 editText .getText ().insert (startIndex , richTextBean .tag );
441489 }
@@ -450,9 +498,7 @@ public void insertEmoji(RichTextBean richTextBean) {
450498
451499 private void insertMentions (RichTextBean richTextBean ) {
452500 int startIndex = editText .getSelectionStart ();
453- Log .e ("startIndex" , startIndex + "" );
454501 int endIndex = startIndex + richTextBean .tag .length () + richTextBean .name .length ();
455- Log .e ("endIndex" , endIndex + "" );
456502 if (editText .getText () != null ) {
457503 editText .getText ().insert (startIndex , richTextBean .tag + richTextBean .name );
458504 }
0 commit comments