Click the text to change the background color of the modified line. A dialog box is displayed, showing the background of the modified line.
I want to reply to A comment by simply using one text. Click A row in the reply text column, and then the background color of the row changes and A dialog box is displayed. For example, we want to reply to, click the row where A is located (A replies B: hahaha ).
Note that the following two lines contain the reply text in a textView.
I have been searching the Internet for a long time, and I have finally realized it with some of my own knowledge.
Reveal the answer (steps are as follows ):
/***
For the second line
CommentName is
ReplyName is B,
CommentContent is the content
***/
1.
SpannableString commentReplyNameContent = null;
CommentReplyNameContent = new SpannableString (commentName + "reply" + replyName + ":" + commentContent );
CommentReplyNameContent. setSpan (new ClickableSpan () // set the effect of the click (only the keyboard is displayed here) {@ Override
Public void updateDrawState (TextPaint ds)
{
Super. updateDrawState (ds );
Ds. setUnderlineText (false); // cancel the underline.
} @ Override
Public void onClick (View widget)
{
ShowKeyBoard (comment. getComentName (); // the keyboard is displayed.
// For other operations, comment. getComentName () is the name of the person to be replied to. If you click these two lines, comment. getComentName () is.
}
}, 0, commentName. length () + replyName. length () + commentContent. length () + 3, Spanned. SPAN_EXCLUSIVE_EXCLUSIVE); commentReplyNameContent. setSpan // set the Color of A (new ForegroundColorSpan (Color. BLUE), 0, commentName. length (), Spanned. SPAN_EXCLUSIVE_EXCLUSIVE); commentReplyNameContent. setSpan // set the background of the entire row to Black (new ForegroundColorSpan (Color. BLACK), commentName. length (), commentName. length () + replyName. length () + commentContent. length () + 3, Spanned. SPAN_EXCLUSIVE_EXCLUSIVE);/*** replyContent for this textView ***/replyContent. append ("\ n"); // line feed
ReplyContent. append (commentReplyNameContent); // append this row to the end of the textView: replyContent. setMovementMethod (new MyLinkMovementMethod (); // This sentence is used to respond to the click effect.
2. Click to change the background color of the line and override LinkMovementMethod.
Private class MyLinkMovementMethod extends LinkMovementMethod
{
@ Override
Public boolean onTouchEvent (TextView widget, Spannable buffer, MotionEvent event)
{
Int action = event. getAction ();
If (action = MotionEvent. ACTION_DOWN | action = MotionEvent. ACTION_DOWN
| Action = MotionEvent. ACTION_MOVE)
{
Int x = (int) event. getX ();
Int y = (int) event. getY (); x-= widget. getTotalPaddingLeft (); // return the textView offset. If textView is set to padding = 3px, 3 is returned.
Y-= widget. getTotalPaddingTop ();/**
* The left side of the view exceeds the screen offset. If a view slides between the left and right, the view on the left is blocked because the view is large,
* The blocked offset is getScrollX (). Similarly, getScrollY ()
*/
X + = widget. getScrollX ();
Y + = widget. getScrollY (); // the above aims to locate the absolute coordinates of the click position in the entire view component (not the relative coordinates of the screen)
Layout layout = widget. getLayout ();
Int line = layout. getLineForVertical (y); // gets the number of lines of text at the click position.
Int off = layout. getOffsetForHorizontal (line, x); // get the offset of the click position. // get the span through the offset (determined by the span corresponding to the offset)
ClickableSpan [] link = buffer. getSpans (off, off, ClickableSpan. class );
If (link. length! = 0)
{
If (action = MotionEvent. ACTION_UP)
{
Link [0]. onClick (widget); buffer. setSpan (new BackgroundColorSpan (Color. TRANSPARENT), buffer. getSpanStart (link [0]),
Buffer. getSpanEnd (link [0]), Spanned. SPAN_EXCLUSIVE_EXCLUSIVE); Selection. removeSelection (buffer );}
Else if (action = MotionEvent. ACTION_DOWN)
{Buffer. setSpan (new BackgroundColorSpan (Color. GRAY), buffer. getSpanStart (link [0]),
Buffer. getSpanEnd (link [0]), Spanned. SPAN_EXCLUSIVE_EXCLUSIVE); Selection. setSelection (buffer, buffer. getSpanStart (link [0]), buffer. getSpanEnd (link [0]);
}
Else if (action = MotionEvent. ACTION_MOVE)
{Buffer. setSpan (new BackgroundColorSpan (Color. TRANSPARENT), buffer. getSpanStart (link [0]),
Buffer. getSpanEnd (link [0]), Spanned. SPAN_EXCLUSIVE_EXCLUSIVE); Selection. removeSelection (buffer );
} Return true;
}
Else
{
Selection. removeSelection (buffer );
}
}
// Returnsuper. onTouchEvent (widget, buffer, event) is required );
// Otherwise, because onTouchEvent is overwritten, ClickableSpan cannot be called during action_up.
Return super. onTouchEvent (widget, buffer, event );
}
}
3. Pop-up keyboard
/*** Pop-up keyboard */private void showKeyBoard (String name) {commentEdit. setHint ("reply" + name); // The input box shows who will reply to commentEdit. requestFocus (); (new Handler ()). postDelayed (new Runnable () {public void run () {(InputMethodManager) (commentEdit. getContext (). getSystemService (Context. INPUT_METHOD_SERVICE ))). toggleSoftInput (0, InputMethodManager. HIDE_NOT_ALWAYS); }}, 100 );}