{"id":13644529,"url":"https://github.com/FJ917/FJEditTextCount","last_synced_at":"2025-04-21T10:33:29.654Z","repository":{"id":217102631,"uuid":"70459037","full_name":"FJ917/FJEditTextCount","owner":"FJ917","description":"栗子——自定义EditText实现右下角计数控件","archived":false,"fork":false,"pushed_at":"2017-09-27T16:13:37.000Z","size":115,"stargazers_count":303,"open_issues_count":5,"forks_count":70,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-08-04T00:06:53.820Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FJ917.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-10-10T06:38:05.000Z","updated_at":"2024-08-02T07:36:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"a931100a-5684-49a1-a709-96aae3064907","html_url":"https://github.com/FJ917/FJEditTextCount","commit_stats":null,"previous_names":["fj917/fjedittextcount","ftandjyq/anfqnumedittext"],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FJ917%2FFJEditTextCount","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FJ917%2FFJEditTextCount/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FJ917%2FFJEditTextCount/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FJ917%2FFJEditTextCount/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FJ917","download_url":"https://codeload.github.com/FJ917/FJEditTextCount/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250040484,"owners_count":21365113,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-02T01:02:06.707Z","updated_at":"2025-04-21T10:33:29.130Z","avatar_url":"https://github.com/FJ917.png","language":"Java","readme":"\n\u003e ### 栗子——自定义EditText实现右下角计数控件\n\n---\n\n![栗子配图.png](http://upload-images.jianshu.io/upload_images/2071764-8d148e73b77178de.png)\n\n---\n\n\u003e ### 栗子惯例，先上GIF\n\n|PERCENTAGE百分比效果|SINGULAR单数效果|\n|:-------------:|:-------------:|\n|![百分比类型.gif](http://upload-images.jianshu.io/upload_images/2071764-9050fc9e607002a4.gif)|![单数类型.gif](http://upload-images.jianshu.io/upload_images/2071764-085344ba61616d59.gif)|\n\n\n\n\u003e ### 使用姿势\n\n#### 1.引用\n\n```\nallprojects {\n\trepositories {\n\t\t...\n\t\tmaven { url 'https://jitpack.io' }\n\t}\n}\ndependencies {\n\tcompile 'com.github.FJ917:FJEditTextCount:版本号'\n\t//compile 'com.github.FJ917:FJEditTextCount:v1.0.1'\n}\n```\n\n#### 2.使用\n\n##### 支持参数\u0026方法汇总\n\n|参数|说明|\n|---|---|\n|etText|xml参数，设置默认文字|\n|etTextSize|xml参数，输入文字大小|\n|etTextColor|xml参数，输入文字颜色|\n|etPromptTextSize|xml参数，提示统计文字大小|\n|etPromptTextColor|xml参数，提示统计文字颜色|\n|etHintColor|xml参数，提示文字颜色|\n|etHint|xml参数，设置提示文字|\n|etMinHeight|xml参数，设置最小高度|\n|etMaxLength|xml参数，设置最大长度（总字数）|\n|etType|xml参数，设置提示统计显示类型(单数singular；百分percentage)|\n|etLineColor|xml参数，设置横线颜色|\n|getText()|java方法，获取输入的文字|\n|setText|java方法，设置默认文字|\n|show()|v1.0.3(含)版本后不需要设置|\n|etPromptPosition|xml参数，设置提示统计显示类型位置（promptUp上方；下方promptDn）|\n\n---\n\n##### v1.0.4版本\n\n新增设置提示统计显示类型位置在横线上方或者横线下方\n\n---\n\n##### v1.0.3版本\n\n这个版本有较大的改动，一些以往在java中设置的参数，移到了xml中进行设置，但是保留了java中设置的方法，但是不建议使用！\n\n**变动的参数**\n\n|变动前(java中的方法)|变动后(xml参数)|参数说明|\n|---------|---------|---------|\n|setEtHint()|etHint|设置提示文字|\n|setEtMinHeight()|etMinHeight|设置最小高度|\n|setLength()|etMaxLength|设置最大长度（总字数）|\n|setType()|etType|设置提示统计显示类型(单数singular；百分percentage)|\n|setLineColor()|etLineColor|设置横线颜色|\n|show()|无|属性移到xml不需要设置|\n|getText()|保留|获取输入的文字|\n\n**xml新增参数**\n\n|参数|说明|\n|---|---|\n|etText|xml参数，设置默认文字|\n|etTextSize|xml参数，输入文字大小|\n|etTextColor|xml参数，输入文字颜色|\n|etPromptTextSize|xml参数，提示统计文字大小|\n|etPromptTextColor|xml参数，提示统计文字颜色|\n|etHintColor|xml参数，提示文字颜色|\n|setText|java方法，设置默认文字|\n\n\n###### xml示例\n\n```\n\u003cfj.edittextcount.lib.FJEditTextCount\n        android:id=\"@+id/fjEdit\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:etHint=\"请输入内容\"\n        app:etLineColor=\"@color/colorAccent\"\n        app:etMaxLength=\"66\"\n        app:etMinHeight=\"200dp\"\n        app:etPromptTextColor=\"@color/colorAccent\"\n        app:etPromptTextSize=\"18sp\"\n        app:etText=\"默认输入的文字\"\n        app:etTextColor=\"@color/colorAccent\"\n        app:etTextSize=\"20sp\"\n        app:etType=\"percentage\" /\u003e\n```\n\n---\n\n##### v1.0.2版本\n\n使用方法和v1.0.1一致\n新增获取输入内容的方法：` fjEdit.getText();`\n\n---\n\n##### v1.0.1版本\n\n初次提交，实现基本功能~\n\n###### xml\n\n```\n\u003cfj.edittextcount.lib.FJEditTextCount\n\tandroid:id=\"@+id/fjEdit\"\n\tandroid:layout_width=\"match_parent\"\n\tandroid:layout_height=\"wrap_content\"/\u003e\n```\n\n###### java\n\n```\nfjEdit = (FJEditTextCount) findViewById(R.id.fjEdit);\nfjEdit.setEtHint(\"内容\")//设置提示文字\n\t.setEtMinHeight(200)//设置最小高度，单位px\n\t.setLength(50)//设置总字数\n\t//TextView显示类型(SINGULAR单数类型)(PERCENTAGE百分比类型)\n\t.setType(FJEditTextCount.SINGULAR)\n\t.setLineColor(\"#3F51B5\")//设置横线颜色\n\t.show();\n```\n\n---\n\n\u003e ### 实现原理\n\n首先通过`LayoutInflater.from`获取到layout,然后`findViewById`拿到里面的控件，这里用了三个控件`EditText,TextView,View`,View是最下面的横线\n\n```\nLayoutInflater.from(context).inflate(R.layout.anfq_num_edittext, this, true);\netContent = (EditText) findViewById(R.id.etContent);\ntvNum = (TextView) findViewById(R.id.tvNum);\nvLine = findViewById(R.id.vLine);\n```\n\n然后提供一些设置值的方法，如右下角的类型（这里有两种类型，即：单数类型和百分比类型）、最大字符的长度、EditText的Hint、横线的颜色。\n\n设置`EditText`的监听TextWatcher（这里是参考了网上的一些代码，具体链接找不到了）\n\n```\npublic void afterTextChanged(Editable s) {\n\teditStart = etContent.getSelectionStart();\n\teditEnd = etContent.getSelectionEnd();\n\t// 先去掉监听器，否则会出现栈溢出\n\tetContent.removeTextChangedListener(mTextWatcher);\n\t// 注意这里只能每次都对整个EditText的内容求长度，不能对删除的单个字符求长度\n\t// 因为是中英文混合，单个字符而言，calculateLength函数都会返回1\n\n\t// 当输入字符个数超过限制的大小时，进行截断操作\n\twhile (calculateLength(s.toString()) \u003e MaxNum) { \n\t\ts.delete(editStart - 1, editEnd);\n\t\teditStart--;\n\t\teditEnd--;\n\t}\n\t// 恢复监听器\n\tetContent.addTextChangedListener(mTextWatcher);\n\t\tsetLeftCount();\n\t}\n\n\t/** 刷新剩余输入字数 */\n\tprivate void setLeftCount() {\n\t\tif(TYPES.equals(SINGULAR)){//类型1\n\t\t\ttvNum.setText(String.valueOf((MaxNum - getInputCount())));\n\t\t}else if(TYPES.equals(PERCENTAGE)){//类型2\n\t\t\ttvNum.setText(MaxNum-(MaxNum - getInputCount())+\"/\"+MaxNum);\n\t\t}\n\t}\n\t/** 获取用户输入内容字数 */\n\tprivate long getInputCount() {\n\t\treturn calculateLength(etContent.getText().toString());\n\t}\n\t/**\n\t* 计算分享内容的字数，一个汉字=两个英文字母，一个中文标点=两个英文标点\n\t* 注意：该函数的不适用于对单个字符进行计算，因为单个字符四舍五入后都是1\n\t* @param cs\n\t* @return\n\t*/\n\tpublic static long calculateLength(CharSequence cs) {\n\t\tdouble len = 0;\n\t\tfor (int i = 0; i \u003c cs.length(); i++) {\n\t\t\tint tmp = (int) cs.charAt(i);\n\t\t\tif (tmp \u003e 0 \u0026\u0026 tmp \u003c 127) {\n\t\t\t\tlen += 1;\n\t\t\t} else {\n\t\t\t\tlen++;\n\t\t\t}\n\t\t}\n\t\treturn Math.round(len);\n\t}\n}\n```\n\n\u003e ### 总结\n\u003e 这种EditText显示输入字数的控件在开发中经常用到，但是如果在多个地方用到的话都要做监听代码重复太多，所以做了一下封装，以便以后使用\n\n---\n\n\n\u003e **个人博客：[WWW.FJ917.COM](http://www.fj917.com)**\u003c/br\u003e\n\u003e **简书：[www.jianshu.com/u/3d2770e6e489](http://www.jianshu.com/u/3d2770e6e489)**\u003c/br\u003e\n\u003e **CSDN：[blog.csdn.net/fj917](http://blog.csdn.net/fj917)**\n\n\n|欢迎加入QQ交流群657206000[点我加入](http://shang.qq.com/wpa/qunwpa?idkey=9b454a6f01bd94d97e4c3f2771447a989ec77794eb5a563422263153c00f700d)|\n|:---:|\n|![QQ交流群：657206000](http://upload-images.jianshu.io/upload_images/2071764-bce605159bbceb2a.png)|","funding_links":[],"categories":["EditText"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FFJ917%2FFJEditTextCount","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FFJ917%2FFJEditTextCount","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FFJ917%2FFJEditTextCount/lists"}