当前位置: 首页 > news >正文

网站建设需要方案璧山网站建设

网站建设需要方案,璧山网站建设,263邮箱企业邮箱入口,网站建设宗旨是什么一、背景及样式效果 因项目需要#xff0c;需要文本编辑时#xff0c;支持项目符号#xff08;无序列表#xff09;尝试了BulletSpan#xff0c;但不是很理想#xff0c;并且考虑到影响老版本回显等因素#xff0c;最终决定自定义一个BulletEditText。 先看效果需要文本编辑时支持项目符号无序列表尝试了BulletSpan但不是很理想并且考虑到影响老版本回显等因素最终决定自定义一个BulletEditText。 先看效果 视频效果 二、自定义View BulletEditText         自定义控件BulletEditText源码 package com.ml512.widgetimport android.content.Context import android.util.AttributeSet import androidx.core.widget.doOnTextChanged/*** Description: 简单支持项目号的文本编辑器* Author: Marlon* CreateDate: 2024/2/1 17:44* UpdateRemark: 更新说明* Version: 1.0*/ class BulletEditText : androidx.appcompat.widget.AppCompatEditText {/*** 是否开启项目符号*/private var isNeedBullet: Boolean false/*** 项目符号*/private var bulletPoint: String • /*** 项目符号占用字符数方便设置光标位置*/private var bulletOffsetIndex bulletPoint.length/*** 相关监听回调*/private var editListener: EditListener? nullconstructor(context: Context) : super(context)constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context,attrs,defStyleAttr)init {this.doOnTextChanged { text, start, before, count -//如果是关闭状态不做格式处理if (!isNeedBullet) {returndoOnTextChanged}if (count before) {//处理项目号逻辑var offset 0var tmp text.toString()//连续回车去掉项目符号if (start bulletOffsetIndex tmp.substring(start, start count) \n) {val preSub tmp.substring(start - bulletOffsetIndex, start)if (preSub bulletPoint) {changeBulletState(false)tmp tmp.replaceRange(start-bulletOffsetIndex, start count, )offset - bulletOffsetIndex 1setTextAndSelection(tmp, start count offset)returndoOnTextChanged}}//加入项目符号if (tmp.substring(start, start count) \n) {changeBulletState(true)tmp tmp.replaceRange(start, start count, \n$bulletPoint)offset bulletOffsetIndexsetTextAndSelection(tmp, start count offset)}}}}override fun onSelectionChanged(selStart: Int, selEnd: Int) {super.onSelectionChanged(selStart, selEnd)//复制选择时直接返回关闭项目符号if (selStart ! selEnd) {changeBulletState(false)return}//判断当前段落是否有项目号有开启没有关闭val tmp text.toString()val prefix tmp.substring(0, selectionStart)if (prefix.isEmpty()) {changeBulletState(false)return}if (prefix.startsWith(bulletPoint) !prefix.contains(\n)) {changeBulletState(true)return}val lastEnterIndex prefix.lastIndexOf(\n)if (lastEnterIndex ! -1 lastEnterIndex bulletOffsetIndex 1 prefix.length) {val mathStr prefix.substring(lastEnterIndex, lastEnterIndex bulletOffsetIndex 1)if (mathStr \n$bulletPoint) {changeBulletState(true)return}}changeBulletState(false)}/*** 更新bullet状态*/private fun changeBulletState(isOpen: Boolean) {isNeedBullet isOpeneditListener?.onBulletStateChange(isOpen)}/*** 设置是否开启项目号*/fun setBullet(isOpen: Boolean) {isNeedBullet isOpenval tmp text.toString()var index selectionStartvar prefix tmp.substring(0, index)val suffix tmp.substring(index)//加项目号if (isOpen) {//首个段落if (!prefix.contains(\n) prefix.startsWith(bulletPoint)) {return}index bulletOffsetIndexif (prefix.isEmpty() || (!prefix.contains(\n) !prefix.startsWith(bulletPoint))) {setTextAndSelection($bulletPoint$prefix$suffix, index)return}prefix prefix.replaceLast(\n, \n$bulletPoint)setTextAndSelection($prefix$suffix, index)return}//去掉项目号if (prefix.startsWith(bulletPoint) !prefix.contains(\n$bulletPoint)) {//首行逻辑index - bulletOffsetIndexprefix prefix.replaceLast(bulletPoint, )setTextAndSelection($prefix$suffix, index)return}if (prefix.contains(\n$bulletPoint)) {index - bulletOffsetIndexprefix prefix.replaceLast(\n$bulletPoint, \n)setTextAndSelection($prefix$suffix, index)}}/*** 设置文本及光标位置*/private fun setTextAndSelection(text: String, index: Int) {setText(text)setSelection(index)}/*** 替换最后一个字符*/private fun String.replaceLast(oldValue: String, newValue: String): String {val lastIndex lastIndexOf(oldValue)if (lastIndex -1) {return this}val prefix substring(0, lastIndex)val suffix substring(lastIndex oldValue.length)return $prefix$newValue$suffix}/*** 设置监听*/fun setEditListener(listener: EditListener) {editListener listener}/*** 监听回调*/interface EditListener {/*** 项目符号开关状态变化*/fun onBulletStateChange(isOpen: Boolean)} } 三、调用 使用时一个项目符号的按钮开关设置调用setBullet(isOpen: Boolean) 设置是否开启项目符号同时实现一个setEditListener(listener: EditListener)根据光标位置判断当前段落是否含有项目符号并回显按钮状态。 com.ml512.widget.BulletEditTextandroid:idid/etInputandroid:layout_widthmatch_parentandroid:layout_height200dpandroid:layout_belowid/tvTitleandroid:layout_marginStart15dpandroid:layout_marginTop15dpandroid:layout_marginEnd15dpandroid:layout_marginBottom15dpandroid:autofillHintsnoandroid:backgrounddrawable/shape_edit_bgandroid:gravitytopandroid:hintstring/text_please_input_some_worldsandroid:inputTypetextMultiLineandroid:padding15dpandroid:textColorcolor/blackandroid:textColorHintcolor/color_FF_999999android:textSize16sp / //点击按钮设置添加/取消项目符号tvBullet.setOnClickListener {tvBullet.isSelected !tvBullet.isSelectedetInput.setBullet(tvBullet.isSelected)}//项目符号状态监听回显到按钮etInput.setEditListener(object :BulletEditText.EditListener{override fun onBulletStateChange(isOpen: Boolean) {tvBullet.isSelected isOpen}}) 大功告成
http://www.pierceye.com/news/732370/

相关文章:

  • 网站公司做的比较好网站建设业务饱和了吗
  • 做网站做电脑版还是手机版好可以访问国外网站的dns
  • 网站制作素材图片英文站 wordpress seo优化
  • 现在ui做的比较好的网站徐州经济技术开发区
  • 网站设计公司网帐号售卖网站建设
  • 信阳建设网站哪家好wordpress 文章评价插件
  • 网校网站模板东莞网站关键字
  • 做游戏的php网站2019做seo网站
  • 做外贸那个网站好免费asp主机网站
  • 网站设计服务要不要交文化事业建设费在线解压zip网站
  • 沈阳关键词自然排名西安百度seo排名软件
  • 徐州网站建设市场分析手工灯笼简单又好看
  • 网站开发学什么语音提供设计的的网站
  • 微站和网站数据同步icp备案查询
  • 诸城网站制作wordpress圆角插件汉化
  • 杨家平网站建设小程序开发网站
  • 校园文化建设图片网站浅析图书馆门户网站建设
  • 网站开发与应用案例教程哈尔滨自助建站系统
  • 网站关键词排名seo百度网址链接是多少
  • 电子商务网站的建设收益直播软件的app
  • 遵义在百度做个网站多少钱如何建立企业网站
  • 我想做个网站手机网站建设优势
  • 网站制作毕业设计滁州市建设局网站
  • saas建站和开源建站的区别比较高端的网页
  • 新公司董事长致辞做网站wordpress二次开发手册chm
  • 网站显示建设中大型企业网站制作
  • 长沙自动化网站建设wordpress 自定义栏目 调用
  • 吉大建设工程学院官方网站wordpress 文章图片插件
  • 赤峰中国建设招标网站网页设计素材网站推荐
  • 天津网站建设电焊机wordpress主题jenney