Android:借用html标签协议,定义自己的协议

Android:借用html标签协议,定义自己的协议

背景

使用html,定制自己的标签协议:比如:

今日有好货,<a href="https://www.taobao.com">点我逛淘宝</a>,有惊喜!!

或者

今日有好货,<a href="page://taobao_home">点我逛淘宝</a>,有惊喜!!

当一个TextView显示上述内容时,还可以点击上面的文字,然后跳转到对应的页面。

解决思路

使用Html.fromHtml对含有标签的文本进行解析,然后重新为其添加自定义的Span

    ...
    /**
     * 绑定解析的Html
     *
     * @param mContentTv 目标的TextView控件
     * @param content 含有html标签的文本内容
     */
     private void bindContentView(final TextView mContentTv, final String content) throws Throwable {
        mContentTv.setMovementMethod(LinkMovementMethod.getInstance());
        String text = mContentTv.getText().toString();
        //解析html
        Spanned spanned = Html.fromHtml(content);
        //获取其中的URL链接的Span
        URLSpan[] spans = spanned.getSpans(0, content.length(), URLSpan.class);
        if (spans != null) {
            //转化为子类
            SpannableStringBuilder spannableStringBuilder = (SpannableStringBuilder) spanned;
            for (URLSpan urlSpan : spans) {
                //获取span的起始位置
                int start = spanned.getSpanStart(urlSpan);
                int end = spanned.getSpanEnd(urlSpan);
                int flag = spanned.getSpanFlags(urlSpan);
                //获取href的链接
                final String pageName = urlSpan.getURL();
                spannableStringBuilder.removeSpan(urlSpan);
                if (start > end || start < 0) {
                    continue;
                }
                //设置点击事件
                spannableStringBuilder.setSpan(new ColorClickableSpan() {
                    @Override
                    public void onClick(View view) {
                         //to open the pageName here
                    }
                }, start, end, flag);
            }
            mContentTv.setText(spannableStringBuilder);
        } else {
            mContentTv.setText(spanned);
        }
        mContentTv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //to do
            }
        });
    }
    ...

其中,我们也可以定制超链接部分的样式:


import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.view.View;

/**
 * @version mochuan.zhb on 2013/3/3.
 * @Author Zheng Haibo
 * @Company Alibaba Group
 * @PersonalWebsite http://github.com/nuptboyzhb
 * @Description 去掉下滑线的点击span
 */
public class FollowClickableSpan extends ClickableSpan {// extend ClickableSpan

    @Override
    public void onClick(View view) {

    }

    @Override
    public void updateDrawState(TextPaint ds) {// override updateDrawState
        ds.setUnderlineText(false); // set to false to remove underline
        ds.setColor(0xff009ff0);
    }

}

同样的思路,我们可以对其他html标签进行解析,然后进行改造;比如:

你还有<font color="#f00">20</font>项代办事情
   /**
     * 将所有的font前景色标签,进行颜色重置
     *
     * @param content
     * @param colorValue
     * @return
     */
    private CharSequence parseSpanResetColor(String content, int colorValue) {
        try {
            Spanned spanned = Html.fromHtml(content);
            SpannableStringBuilder spannableStringBuilder = (SpannableStringBuilder) spanned;
            ForegroundColorSpan[] spans = spanned.getSpans(0, content.length(), ForegroundColorSpan.class);
            if (spans.length > 0) {
                for (ForegroundColorSpan foregroundColorSpan : spans) {
                    int start = spanned.getSpanStart(foregroundColorSpan);
                    int end = spanned.getSpanEnd(foregroundColorSpan);
                    int flag = spanned.getSpanFlags(foregroundColorSpan);
                    spannableStringBuilder.removeSpan(foregroundColorSpan);
                    spannableStringBuilder.setSpan(new ForegroundColorSpan(colorValue), start, end, flag);
                }
            }
            return spannableStringBuilder;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new SpannableString(content);
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我不能提供一个完整的教室借用系统的代码,因为这需要考虑很多方面,包括安全性,数据管理,用户权限等等。不过,我可以提供一些教室借用系统的基本功能和相关的代码片段。 1. 用户登录和注册 在教室借用系统中,用户需要注册并登录才能提交借用请求。以下是一个简单的用户登录和注册的HTML代码: ``` <!-- 登录页面 --> <form action="/login" method="post"> <label for="username">用户名:</label> <input type="text" id="username" name="username"> <label for="password">密码:</label> <input type="password" id="password" name="password"> <input type="submit" value="登录"> </form> <!-- 注册页面 --> <form action="/register" method="post"> <label for="username">用户名:</label> <input type="text" id="username" name="username"> <label for="password">密码:</label> <input type="password" id="password" name="password"> <label for="email">电子邮件:</label> <input type="email" id="email" name="email"> <input type="submit" value="注册"> </form> ``` 注意,这只是一个基本的HTML代码,你需要在后端实现相应的登录和注册功能,并且对用户的输入进行验证和处理。 2. 教室借用申请 用户登录后,可以提交借用申请,以下是一个简单的教室借用申请的HTML代码: ``` <form action="/borrow" method="post"> <label for="classroom">教室名称:</label> <input type="text" id="classroom" name="classroom"> <label for="date">借用日期:</label> <input type="date" id="date" name="date"> <label for="time">借用时间:</label> <input type="time" id="time" name="time"> <input type="submit" value="提交申请"> </form> ``` 同样,你需要在后端实现相应的借用申请功能,并且对用户的输入进行验证和处理。 3. 借用申请审核 管理员需要审核借用申请,并将结果通知用户。以下是一个简单的借用申请审核的HTML代码: ``` <!-- 借用申请列表 --> <table> <thead> <tr> <th>教室名称</th> <th>借用日期</th> <th>借用时间</th> <th>申请人</th> <th>审核状态</th> </tr> </thead> <tbody> {% for request in requests %} <tr> <td>{{ request.classroom }}</td> <td>{{ request.date }}</td> <td>{{ request.time }}</td> <td>{{ request.user.username }}</td> <td>{{ request.status }}</td> </tr> {% endfor %} </tbody> </table> <!-- 借用申请审核表单 --> <form action="/approve" method="post"> <input type="hidden" id="request_id" name="request_id" value="{{ request.id }}"> <label for="status">审核状态:</label> <select id="status" name="status"> <option value="approved">通过</option> <option value="rejected">拒绝</option> </select> <label for="comment">审核意见:</label> <textarea id="comment" name="comment"></textarea> <input type="submit" value="提交审核"> </form> ``` 注意,这里使用了模板引擎(比如Django的模板引擎),你需要在后端实现相应的借用申请列表和审核功能,并且对用户的输入进行验证和处理。 总之,教室借用系统是一个比较复杂的项目,需要考虑很多方面,建议你仔细规划并逐步实现。同时,为了保证系统的安全性和可靠性,建议你寻求专业人士的帮助和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值