(一)问题

怎样实现带有横栏的EditText(像记事本的编辑界面那样)?

(二)初步思路

1.通过修改EditText背景来实现(系统背景是一个框形图片,内部透明,替换为一个带有横栏的图片即可)

2.通过重绘EditText来实现(自定义组件,自己画线)

3.用ListView实现(ListView本身就会显示横线)

(三)深入分析

1.EditText显示多行文本时会自动拉伸背景,若要保证边框不会失真,需要用9patch图片来做背景,或许能够实现

2.毫无疑问,自定义EditText一定可以实现横线的显示(没有枪炮就自己造...),但是自定义组件比较麻烦(需要重写很多东西),能用其他方法解决当然更好

3.ListView用来显示多行文本可能比较好(将Text分割为等长String存入Array,作为ListView的Adapter),但是若要编辑文本则明显不合适

(四)初步实践

1.通过多次测试发现改变EditText的背景图能够显示横栏,但仅限于SingLine的文本,因为输入多行文本时背景图会向下拉伸(横线没了...)。所以测试结果是:用自定义背景图只能显示带下划线的单行文本,方案一失败!但是在此过程中学到了9patch图片的用处,算是一点小收获。

2.通过重写EditText的onDraw方法来绘制需要的横线,如何确定横线的位置成为核心问题(本质是获取一组起点坐标和一组对应的终点坐标),此方法在下面展开详述

3.ListView的缺点在上面已经说过了,但是经过对方案一的尝试,我们很容易发现方案一和方案三恰好互补(把方案一得到的EditText作为ListView的Item),此时应该为EditText自定义selector,设置focus时不发光即可。测试结果是:单行EditText负责按行显示文本,ListView负责画线,方案一组合方案三可行。

(五)自定义EditText实现横栏的显示

[自定义myEditText类]

package com.ayqy.app_test;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.widget.EditText; public class myEditText extends EditText{ private int lineColor;//横线颜色
private float lineWidth;//横线宽度 public myEditText(Context context) {
super(context); //设置默认颜色和横线宽度
lineColor = Color.BLUE;//默认蓝色线
lineWidth = 2f;//宽度为2
} public myEditText(Context context,int color,float width) {
super(context); //设置颜色和横线宽度
this.lineColor = color;
this.lineWidth = width;
} @Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas); //创建画笔
Paint mPaint = new Paint();
mPaint.setStrokeWidth(lineWidth);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(lineColor); //获取参数
int w = this.getWidth();//获取控件宽度
int h = this.getHeight();//获取控件高度
int padB = this.getPaddingBottom();//获取底部留白
int padL = this.getPaddingLeft();//获取左边留白
int padR = this.getPaddingRight();//获取右边留白
float size = this.getTextSize() * 7 / 6;//获取横栏间距(TextSize的默认值为18)
/*设置size的值是一个核心问题,size的值要适应不同的字体大小(不同大小字体的行距也不同)
*经过多次尝试发现以字体大小的7/6倍作为横栏间距最合适
* */
int lines = (int)(h / size);//获取行数 //从下向上画线
for(int i = 0;i < lines;i++)
canvas.drawLine(padL//startX
, this.getHeight() - padB - size * i//startY
, this.getWidth() - padR//endX
, this.getHeight() - padB - size * i//endY
, mPaint);
} public int getLineColor() {
return lineColor;
} public void setLineColor(int color) {
this.lineColor = color;
} public float getLineWidth() {
return lineWidth;
} public void setLineWidth(float width) {
this.lineWidth = width;
} }

[布局文件]

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > </LinearLayout>

[测试类]

package com.ayqy.app_test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.LinearLayout; public class MainActivity extends Activity { LinearLayout root;//声明根布局 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); root = (LinearLayout) findViewById(R.id.root);//获取根布局
//创建自定义EditText控件对象
myEditText txt = new myEditText(this);
//设置多行文本
txt.setText("这是一个很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的测试内容");
//用来测试是否能够适应不同大小的字体
//txt.setTextSize(48);
//txt.setTextSize(24);
root.addView(txt);//添加控件
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

[P.S.以上源码本机测试无误,若在测试中发现任何问题请在下方留言]

(六)测试结果图片

(七)总结

尝试是解决问题的最好方法,即便最终问题得不到解决,其间的思考也是一种锻炼

(八)BUG修正

此版本存在BUG,详情及修正方法见 http://www.cnblogs.com/ayqy/p/3600289.html

Android实现自带横线的EditText的更多相关文章

  1. 35.Android之带删除按钮EditText学习

    今天实现Android里自定义带删除功能的EditText,效果如下: 当输入内容时,EditText变为带有一个删除功能按钮的编辑框,如图: 实现代码很简单,直接上代码, 布局文件xml: < ...

  2. Android实现自定义带文字和图片的Button

    Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就 ...

  3. 安卓自动化测试:Android studio 自带的 Record Espresso Test || [ Appium & (Android studio || Python|| Eclipse ) ]

    1.Android studio 自带的 Record Espresso Test  https://developer.android.com/studio/test/espresso-test-r ...

  4. 手把手让你爱上Android sdk自带“9妹”(9patch 工具)

    前几天群成员讨论过关于9patch的工具[我比较喜欢喊它9妹子,西西(*^_^*)].然后研究了一下,比较简单但是很实用的一个Android sdk 自带工具.这里给大家做一个分享下经验! 1.什么是 ...

  5. 网络编程之PC版与Android手机版带断点续传的多线程下载

    一.多线程下载         多线程下载就是抢占服务器资源         原理:服务器CPU 分配给每条线程的时间片相同,服务器带宽平均分配给每条线程,所以客户端开启的线程越多,就能抢占到更多的服 ...

  6. Android中实现全屏、无标题栏的两种办法(另附Android系统自带样式的解释)

    在进行UI设计时,我们经常需要将屏幕设置成无标题栏或者全屏.要实现起来也非常简单,主要有两种方法:配置xml文件和编写代码设置. 1.在xml文件中进行配置 在项目的清单文件AndroidManife ...

  7. 【Android】自带Theme

    [Android]自带Theme android之uses-permission   在编写Android程序时经常会忘记添加权限,下面是网上收集的关于Android uses-permission的 ...

  8. Android SurfaceView实战 带你玩转flabby bird (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...

  9. 运行Android Studio自带模拟器报:Guest isn't online after 7 second...

    今天在运行Android Studio自带的手机模拟器时,出现如下异常情况 : 解决办法: 1.打开Android Virtue Device Manager,点击编辑选项 2.点击show Adva ...

随机推荐

  1. x86汇编知识点汇总

    目录: 1.进制转换 2.原码.反码.补码 3.寄存器 4.存储器的段结构 5.堆栈 6.传送类指令 7.算术运算类指令(不含乘除) 8.位操作类指令 9.标志位操作指令 10.标识符.常量与变量 1 ...

  2. 37. Sudoku Solver (Array;Back-Track)

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  3. Js语言的奇怪特性

    var a = .3 - 2; console.log(a); a = 0.099999998 而不是0.1,是不是很奇怪?

  4. Distributing Ballot Boxes

    Distributing Ballot Boxes http://acm.hdu.edu.cn/showproblem.php?pid=4190 Time Limit: 20000/10000 MS ...

  5. SpringMVC入门(基于注解方式实现)

    ---------------------siwuxie095                             SpringMVC 入门(基于注解方式实现)         SpringMVC ...

  6. 用HttpClient发送HTTPS请求报SSLException: Certificate for <域名> doesn't match any of the subject alternative names问题的解决

    最近用server酱-PushBear做消息自动推送,用apache HttpClient做https的get请求,但是代码上到服务器端就报javax.net.ssl.SSLException: Ce ...

  7. VS Access DataSet 插入

    在使用vs2008+access数据库,然后又使用了数据集,这时候插入操作遇到了问题,各种乱七八糟.各种头疼的问题就不说了,现在说找到的解决方法: 在xsd文件中插入TableAdapter后,会自动 ...

  8. php 使用PHPExcel 导出数据为Excel

    <?php require_once 'PHPExcel/Classes/PHPExcel.php'; /** * 导出数据为Excel * @param array $fieldArr 标题数 ...

  9. win8 app code中设置Resources里定义好的Style

    WPF中应该可以用这个: rectangle.Style = (Style)FindResource("FormLabelStyle"); 但 Win8.1 App是个精简框架,F ...

  10. 选择排序(直接排序)java语言实现

    class demo { public static void main(String[] args) { int[] arr={1,4,2,6,8,9,0,5,3,2,2,4,4,6,7,8}; f ...