編輯:關於android開發
我想單純靠一個文本實現微信回復評論的效果,在一列回復文本中點擊某一行,然後該行的背景色改變並且彈出對話框,如下圖,我們想要回復A,那麼就點擊A所在的那一行(A回復B:哈哈哈)。
注意,這裡兩行包括下面一系列的回復文本都是在一個textView中。
網上查了許久,結合自己的一些知識,終於實現了。
揭曉答案(步驟如下):
/** *
對於第二行來說
commentName為A
replyName為B,
commentContent為內容
* **/
1.
SpannableString commentReplyNameContent = null;
commentReplyNameContent = new SpannableString(commentName + "回復" + replyName + ":" + commentContent);
commentReplyNameContent.setSpan(new ClickableSpan() //設置點擊時候的效果(在這裡只是彈出鍵盤而已) { @Override
public void updateDrawState(TextPaint ds)
{
super.updateDrawState(ds);
ds.setUnderlineText(false); //取消下劃線
} @Override
public void onClick(View widget)
{
showKeyBoard(comment.getComentName()); //彈出鍵盤
//或者進行其他操作,comment.getComentName()為要回復的人的名字,即點擊這二行的話,comment.getComentName()就為A
}
}, 0, commentName.length() + replyName.length() + commentContent.length() + 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); commentReplyNameContent.setSpan //設置A的顏色 (new ForegroundColorSpan(Color.BLUE), 0, commentName.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); commentReplyNameContent.setSpan //設置整一行的背景為黑色 (new ForegroundColorSpan(Color.BLACK), commentName.length(), commentName.length() + replyName.length() + commentContent.length() + 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); /** * replyContent為此textView * **/ replyContent.append("\n"); //換行
replyContent.append(commentReplyNameContent);// 把這一行追加在textView後面 replyContent.setMovementMethod(new MyLinkMovementMethod());//這句話是為了響應點擊效果。
2.點擊改變那一行的背景色,重寫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();// 返回textView的偏移量,如textView設置了padding=3px,則返回3
y -= widget.getTotalPaddingTop(); /**
* 左側超出屏幕的偏移量,如一個view可左右滑動,由於此view比較大,左側的view被擋住了,
* 被擋住的偏移量就是getScrollX(),同理getScrollY()
*/
x += widget.getScrollX();
y += widget.getScrollY(); // 上述的目的是定位出點擊的位置 在整個view組件的絕對坐標(不是屏幕的相對坐標)
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y); // 獲取點擊位置的 text的行數
int off = layout.getOffsetForHorizontal(line, x);// 獲取點擊位置的偏移量 // 通過偏移量來獲取span (具體是通過偏移量對應的span來確定)
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);
//否則因為重寫了onTouchEvent,導致在action_up的時候無法調用ClickableSpan
return super.onTouchEvent(widget, buffer, event);
}
}
3.彈出鍵盤
/** * 彈出軟鍵盤 */ private void showKeyBoard(String name) { commentEdit.setHint("回復"+name); //輸入框顯示要回復誰 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); }
Android源碼裝飾模式---ContextWrapper 如果說Android源碼中哪個地方裝飾模式應用的最明顯的話,那肯定是非ContextWrapper莫屬了
activity切換動畫特效,activity切換特效效果圖: 結構圖: 測試代碼: 布局: 1 <?xml version=1.
Android生命周期,activity生命周期 Activity主要有以下七個回調方法: 1、onCreate() 在Activity第一次創建時調用。 2、onSta
Android 的系統架構,Android系統架構Android 的系統架構 Android其本質就是在標准的Linux系統上增加了Java虛擬機Dalvik,並在Dal