自定义EditText画任意行线并限制文本的物理长度
来源:互联网 发布:淘宝类目分析模板 编辑:程序博客网 时间:2024/05/29 17:00
项目中有个需求 就是需要EditText变为两行显示 而且当文字写到第二行末尾的时候要提示文字已达限制。
1. EditText本身没有自带的行线 所以需要自己自定义 画出自己需要的行线。这里我是在网上一个盆友那儿找的一段代码 自己修改了下,效果出来了。(谢谢那位朋友,因为当时很急没来得及收藏链接,抱歉)
public class UnderLineEditText extends EditText { private Paint linePaint; private int paperColor; public UnderLineEditText(Context context,AttributeSet paramAttributeSet) { super(context,paramAttributeSet); // TODO Auto-generated constructor stub this.linePaint = new Paint(); linePaint.setColor(Color.GRAY);//设置下划线颜色 linePaint.setStrokeWidth(2); } protected void onDraw(Canvas paramCanvas) { paramCanvas.drawColor(this.paperColor); //设置背景色 int i = getLineCount(); //行数 int j = getHeight(); //View的高度 int k = getLineHeight(); // int m = 1 + j / k; if (i < m) i = m; int n = getCompoundPaddingTop(); //此处调整 画线的位置...用DP 避免手机分辨率的影响 int distance_with_btm=(int) (getLineHeight()-getTextSize())-dip2px(getContext(), 5); //int distance_with_btm=(int) (getLineHeight()-getTextSize())-3; //这个关于距离底部的变量当不使用lineSpacingMultiplier和lineSpacingExtra参数时是不起作用的 for (int i2 = 0;; i2++) { if (i2 >= i) { super.onDraw(paramCanvas); paramCanvas.restore(); return; } n += k; n-=distance_with_btm;//将线划在字体靠下面 paramCanvas.drawLine(0.0F, n+10, getRight(), n+10, this.linePaint); paramCanvas.save(); n+=distance_with_btm;//还原n } } /************************ DP PX 转换 **************************************//** * 根据手机的分辨率从 dp 的单位 转成为 px(像素) * * @param context * Context对象 * @param dpValue * dp值 * @return int px值 */public static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);} }
对应在xml中的代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.twolineedittext.UnderLineEditText android:id="@+id/et_line" android:layout_width="match_parent" android:layout_height="70dp" android:background="@null" android:ems="10" android:gravity="top" android:imeOptions="actionDone" android:inputType="textMultiLine" android:lineSpacingMultiplier="1.5" android:maxLines="2" > <requestFocus /> </com.example.twolineedittext.UnderLineEditText></RelativeLayout>这里需要注意一下的是 固定EditText的高度 就可以让它显示到自己所需要的行数,运行效果如下图
看上去 效果达到了。但是当第二行继续输入的时候可以一直不停的输入。然后直接设置EditText 的 maxLength 属性。但是中文和英文的长度是不一样的。我想很多盆友也受到过和我一样的苦恼吧。然后去找度娘 看到了一个方法可以获取到EditText的物理像素长度,个根据自己的需求运用到EditText中 当文本输入到编辑框末尾的时候弹出提示字数达到限制,这里判断物理长度 而不是文本长度。代码如下:
public class MainActivity extends Activity {EditText et_line;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et_line=(EditText) findViewById(R.id.et_line);}@Overridepublic void onWindowFocusChanged(boolean hasFocus) {super.onWindowFocusChanged(hasFocus);//这个TextView的长度 和EditText的长度一样 。获取此长度方便进行比较TextView line = (TextView) findViewById(R.id.line);final int width = line.getWidth();//监听文本框的文本改变et_line.addTextChangedListener(new TextWatcher() {public void onTextChanged(CharSequence s, int start, int before,int count) {//如果第二行还剩15dp的时候便提示字数达到限制 if (getTextWidth(et_line) >= (width * 2 - UnderLineEditText.dip2px(getApplicationContext(), 15))) {Toast.makeText(MainActivity.this, "字数已达限制",0).show();//获取文本来设置编辑框限制的文本长度et_line.setFilters(new InputFilter[]{new InputFilter.LengthFilter(et_line.getText().toString().length())}); } }public void beforeTextChanged(CharSequence s, int start, int count,int after) {}public void afterTextChanged(Editable s) {}});//点击Enter不执行跳行。et_line.setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {if (keyCode == 66) { // ENTERreturn true;}return false;}});}/** * 获取输入框的物理长度 * @param et * @return */public int getTextWidth(EditText et) {// 得到输入框的物理长度TextPaint paint = et.getPaint();float textWidth = paint.measureText(et.getText().toString());return (int) textWidth;}}运行效果如下图:
自己记下或许以后用得到,也希望能帮到和我一样的朋友们。最后附上Demo下载地址:http://download.csdn.net/detail/yangbo437993234/8851841
0 0
- 自定义EditText画任意行线并限制文本的物理长度
- Android EditText限制文本输入的长度并给予提示
- 限制edittext的最大长度
- 限制EditText的内容长度
- android edittext 输入长度限制并提示
- android edittext 输入长度限制并提示
- EditText输入长度限制,并提示信息
- C语言程序设计习题1-16 打印任意长度的输入行的长度,并尽可能多地打印文本
- EditText文本长度的设置
- EditText限制输入类型为英数字并限制长度
- 1.16 修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多地打印文本。
- 通过自定义属性限制文本域长度
- 练习1-16 修改打印最长文本行的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多地打印文本
- edittext 和exittextprefence的字符长度限制
- Android EditText控件限制输入的长度
- 限制Edittext输入的字节长度
- EditText限制输入长度
- EditText添加长度限制
- ViewPropertyAnimator介绍
- 用 PHP 编写支持高并发的网站
- java 理解Java对象序列化
- [leetcode] Longest Substring Without Repeating Characters
- fibonacci递归算法的“备忘录/Memo”优化法
- 自定义EditText画任意行线并限制文本的物理长度
- CAS简介
- 整理入门笔记_Spring
- 了解 web 及网络基础——极客学院学习笔记
- Xilinx实习一年总结
- 编写网络程序
- bluestacks手机模拟器安装qq或微信时,鼠标左键点聊天编辑框后会自动输入 c 字母
- 进程互斥(一)相关概念
- Java设计模式之抽象工厂模式