Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> 點擊文本改變改行背景色,彈出對話框,改行背景

點擊文本改變改行背景色,彈出對話框,改行背景

編輯:關於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);
    }
    

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved