点击文本改变改行背景色,弹出对话框

我想单纯靠一个文本实现微信回复评论的效果,在一列回复文本中点击某一行,然后该行的背景色改变并且弹出对话框,如下图,我们想要回复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);
    }
    
时间: 2024-10-06 07:57:28

点击文本改变改行背景色,弹出对话框的相关文章

Android点击返回键back时弹出对话框Dialog

public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { ExitDialog(MainActivity.this).show(); return true; } return super.onKeyDown(keyCode, event); } private Dialog ExitDialog

设置点击文本框或图片弹出日历控件

<input id="startDate" value="" readonly="true" type="text" style="cursor: pointer" class="user_datepicker "><input class="canlderImg" data-tag="start" type="imag

页面table的每行都有一个&lt;input type=&#39;button&#39; /&gt;,如何实现点击按钮在按钮下方弹出一个div,点击空白消失

\ <input id="test" type="button" />/*按钮*/ <div id="tanchu"></div> <script language="javascript"> $(document).ready(function(e) { $("#test").click(function(e) { $("#tanchu"

jQuery点击自身以外地方关闭弹出层

$(function(){ $(document).bind("click", function (e) { if($(e.target).closest("#txt").length>0){ $("#tip").show(); }else{ $("#tip").hide(); } }); }); closest会首先检查当前元素是否匹配,如果匹配则直接返回元素本身.如果不匹配则向上查找父元素,一层一层往上,直到找到匹配

经验总结:WebBrowser自动点击弹出提示框alert、弹出对话框confirm、屏蔽弹出框、屏蔽弹出脚本错误的解决办法

经验总结:WebBrowser自动点击弹出提示框alert.弹出对话框confirm.屏蔽弹出框.屏蔽弹出脚本错误的解决办法 网上有好多解决方法,可是不一定好使,本人经过多次试验,针对WebBrowser控件中自动点击弹出框及禁用脚本提示问题得到如下几种实际情况的解决办法,绝对管用. 1.屏蔽弹出错误脚本 将WebBrowser控件ScriptErrorsSuppressed设置为True即可. (参考本篇博客:http://www.cnblogs.com/qqflying/archive/20

android 开发点击弹出对话框中的按钮进行页面跳转如何实现

android开发中,点击弹出对话框中的按钮进行页面跳转,如何实现?可以这样做: 可以获取对话框的点击事件,比如点击了确定然后你就跳转 AlertDialog.Builder builder = new Builder(CommentActivity.this); builder.setMessage("确定要跳转吗?"); builder.setTitle("提示"); builder.setPositiveButton("确认", new a

[Selenium]通过Selenium实现在当前浏览器窗口点击一个图标之后,弹出另外一个窗口,关闭这个窗口,再回到原来的窗口进行操作

public void clickReportIcon(){ String initialWindowHandle = driver.getWindowHandle(); //保存原始的浏览器窗口 page.getReportIcon().click(); //这个操作之后将会弹出另外一个浏览器窗口 Set <String> set = driver.getWindowHandles(); set.remove(initialWindowHandle); assert set.size()==

windows7点击&quot;安全删除硬件并弹出媒体&quot;无反应解决方法

windows7点击"安全删除硬件并弹出媒体"无反应解决方法 我在移除硬件时,点击"安全删除硬件并弹出媒体"无反应的问题,如果采取直接拔掉USB,可能会损坏U盘或移动硬盘,对于该问题通过以下方式可以简单解决:        "开始菜单">>"控制面板">>"系统和安全">>"管理工具">>"服务">>在&qu

Selenium(八):其他操作元素的方法、冻结界面、弹出对话框、开发技巧

1. 其他操作元素的方法 之前我们对web元素做的操作主要是:选择元素,然后点击元素或者输入字符串. 还有没有其他的操作了呢?有. 比如:比如鼠标右键点击.双击.移动鼠标到某个元素.鼠标拖拽等. 这些操作,可以通过Selenium提供的ActionChains类来实现. ActionChains类里面提供了一些特殊的动作的模拟,我们可以通过 ActionChains 类的代码查看到,如下所示: 我们以移动鼠标到某个元素为例. 百度首页的右上角,有个更多产品选项,如下图所示: 如果我们把鼠标放在上