Android基础控件之TextView与EditText

来源:互联网 发布:无主之地2mac版汉化 编辑:程序博客网 时间:2024/06/05 04:12

天下文章大家抄,以下所有内容,有来自copy,有来自查询,亦有自己的总结(目的是总结出自己的东西),所以说原创,不合适,说是转载也不恰当,所以我称之为笔记,可惜没有此分类选项,姑且不要脸一点,选择为原创,希望各位看官冷静勿喷,能接受的赞一个,不能接受的速喷赶紧走......(转载请注明出处,没功劳也有苦劳...)

初学Android,第一个便是显示“hello world”,而TextView也就这样成为第一个接触的控件,顾名思义,用来显示文字类的控件。

常用属性之一,设置文字单行显示

<TextViewandroid:layout_width="200dp"android:layout_height="wrap_content"android:text="@string/hello_world" android:singleLine="true" //true表示单行显示,false表示多行,默认就是多行显示android:ellipsize="start" //此属性配合单行显示,标明单行的省略号所在位置,值有 none,start,middle,end,marquee/*使用下列属性设置,表示文字为自动滚动的跑马灯效果,同理也是单行显示有效*///android:ellipsize="marquee"//android:focusable="true"//android:focusableInTouchMode="true"//android:marqueeRepeatLimit="marquee_forever"/>

 

对比效果如图:



跑马灯滚动效果,在同一时刻中只有一个TextView起作用,因为跑马灯效果默认需要TextView的isFocused()方法返回为true时才会跑动。

如果需要多个TextView同时展现滚动效果,有两种方式解决:

第一种: 

对需要滚动的TextView设置好相应属性后,在代码中添加 textView.setSelected(true);

例如:

public class MainActivity extends Activity {TextView textView_1;TextView textView_2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView_1=(TextView) findViewById(R.id.text_1);textView_2=(TextView) findViewById(R.id.text_2);textView_1.setSelected(true);textView_2.setSelected(true);}}


第二种:

需要自己定义一个类,继承TextView,并重写isFocused()方法,将其返回设置为true,在布局中用自定义的控件代替TextView,即可实现多个滚动效果。

示例如下:

public class MyText extends TextView {public MyText(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stub}public MyText(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}public MyText(Context context) {super(context);// TODO Auto-generated constructor stub}@Overridepublic boolean isFocused() {// TODO Auto-generated method stub//return super.isFocused();return true; //此处返回true}}



 

常用属性之二 :显示超链接

两种方式在TextView中建立超链接

方式一:

使用 android:autoLink标签

或者使用Linkify这个辅助类,此处不深入探讨。

<TextView        android:textColor="#FFA500"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world"         android:autoLink="all"//此处可选枚举值none,web,email,phone,map,all;分别对应需要显示的链接        android:linksClickable="false"  //这个属性配合autoLink ,用来控制链接是否可以点击触发,默认是true        android:textColorLink="#FFA500" //此属性可用于设置超链接显示的颜色,默认是蓝色/>

对于Linkify的用法,其中有类似autoLink标签的使用方式,也有添加自定义的方法。

如将电话号码设为超链接:

textView_1=(TextView) findViewById(R.id.text_1);Linkify.addLinks(textView_1, Linkify.PHONE_NUMBERS);

添加后自动将TextView中连续的数字转为电话号码链接。


使用标签控制的不便之处在于,对于phone的链接,会将文字中所有的数字定义为电话链接,有时候不是我们所需要的,
对于map,地图属性,是与google地图相关的,使用标准地址查询格式Address: 620 Eighth Avenue New York, NY 10018
很明显,中文是不行了,所以不常用,最常用应该为web 和 phone 。
总之单纯使用android:autoLink设置超链接灵活度不够高,也有拓展问题,有时候我们还需要像html中类似
<a href=" ">链接</a>这样的方式来显示链接,这就需要用到下面的,自定义超链接
先看链接效果图


上半部分是使用autoLink展示的各式超链接,下半部分是自定义的超链接,分别是两个TextView自定义超链接,可以单独对所需的部分文字添加为超链接,定义点击链接后的的效果,比如打开某个文件,访问某个界面,可以自定义超链接颜色,可以去除超链接下划线,有点小华丽。

虽然感觉很多地方都不会这么去用,但是却不影响这个功能的强大。

public class MainActivity extends Activity {TextView textView_1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView_1=(TextView) findViewById(R.id.test_text);String url="<a href='http://www.baidu.com'>百度一下</a>";textView_1.setText("自定义链接:");textView_1.append("\n\n");textView_1.append(Html.fromHtml(url));textView_1.append("\n\n");SpannableStringBuilder ssb=new SpannableStringBuilder("拨打联系电话\n\n指向地图\n\n打开图片文件\n\n启动Activity");ssb.setSpan(new URLSpan("tel:13800138000"), 0, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);ssb.setSpan(new URLSpan("geo:22.544199,114.088025"), 8, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);ssb.setSpan(new MyClickSpan("file:///sdcard/Photo/007.jpg","image/*"), 14, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);ssb.setSpan(new MyClickSpan(".SecondActivity",null), 22, 32, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);ssb.setSpan(new ForegroundColorSpan(Color.RED), 0, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//也可以在设置完链接属性后再更改文字颜色textView_1.append(ssb);textView_1.setMovementMethod(LinkMovementMethod.getInstance());//记得添加,否则点击超链接没有效果}/**自定义超链接需要自定义一个类,继承自ClickableSpan,并重写以下两个关键方法以完成实现*/class MyClickSpan extends ClickableSpan{private String type="";private String src="";private MyClickSpan() {super();// TODO Auto-generated constructor stub}public MyClickSpan(String src,String type) {this.src=src;// TODO Auto-generated constructor stubif(type!=null)this.type=type;}@Overridepublic void updateDrawState(TextPaint ds) {// TODO Auto-generated method stubds.setColor(Color.GREEN);      //设置超链接颜色ds.setUnderlineText(false);    //设置是否有下划线}@Overridepublic void onClick(View widget) {     //超链接点击的实现// TODO Auto-generated method stubIntent intent=new Intent();if("".equals(type)){intent.setClassName(widget.getContext(), widget.getContext().getPackageName()+src);}else{Uri uri=Uri.parse(src);intent.setAction(Intent.ACTION_VIEW);intent.setDataAndType(uri, type);}startActivity(intent);}}}


以上,关于TextView告一段落,接下来是EditText,它继承自TextView,所以对TextView有效的设置,大部分对EditText也有效。

对于EditText,常用在用户需要文字输入的地方,登陆,输入密码等等。

同样也可以自定义样式,输入框边框颜色,圆角,背景色渐变等等。

效果例图


当中的自定义样式,通过标签属性android:background="@drawable/et_bg"来设置

有关样式属性,在res/drawable目录下建立file.xml名字自己取。


<shape xmlns:android="http://schemas.android.com/apk/res/android" >    <solid android:color="#00fa9a"/>  //设置纯色背景,当同时设置渐变色背景时,此属性失效    <stroke android:width="3dp" android:color="#f5ffd700"/>  //设置边框线条宽度及颜色    <corners android:radius="5dp"/>    //设置外部圆角,单位dp    <padding android:top="10dp" android:left="10dp"             android:right="10dp" android:bottom="10dp"/>  //设置文字内容内边距<gradient android:startColor="#da70d6"      android:endColor="#e6e6fa"      android:angle="90"/>  //设置渐变颜色,分别是开始颜色,结束颜色,渐变开始角度,角度设置为0或45的整数倍</shape>

还有一个常用属性,用于输入内容控制。

如:

android:inputType="number"  弹出输入法为数字九宫格,限定输入数字,还有其他枚举值,可一一尝试。

另外也可以自定义限定的输入内容,

属性android:digits="12345/*-+" 这样设置后从软键盘输入的内容只有指定字符才有效,其他字符不会输入到选框中。

接下来是EditText与输入法的相关问题,竖屏应用情况下,一切都是正常,但我们有时会需要横屏的时候弹出输入法,这时输入法显示样式遍充满了整个屏幕

如图:



这样遮挡住了输入选框,android之所以横屏下默认此设置,是因为当时手机屏幕普遍不大,横屏下输入法会占用很大空间,索性直接全屏,但是现在手机各种大,对这个问题已经不在意了,所以我们需要横屏下也能展示输入选框:

如图:


这种模式需要在EditText的xml标签中添加一个属性

android:imeOptions="flagNoExtractUi"

同时此标签属性还能控制输入法右下角动作名称

可以用“|”符号与上面设置同存

android:imeOptions="actionNext|flagNoExtractUi"

    

android:imeOptions="actionGo|flagNoExtractUi"

  

以下是几个常用常量值,分别对应

actionUnspecified  未指定,对应常量EditorInfo.IME_ACTION_UNSPECIFIED.  
actionNone 没有动作,对应常量EditorInfo.IME_ACTION_NONE 
actionGo 去往,对应常量EditorInfo.IME_ACTION_GO
actionSearch 搜索,对应常量EditorInfo.IME_ACTION_SEARCH    
actionSend 发送,对应常量EditorInfo.IME_ACTION_SEND   
actionNext 下一个,对应常量EditorInfo.IME_ACTION_NEXT   
actionDone 完成,对应常量EditorInfo.IME_ACTION_DONE  

对于设定常量后的动作捕捉方法,通过对edittext添加监听方法实现

例子代码

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editText=(EditText) findViewById(R.id.edittext);editText.setSelection(editText.length());editText.setOnEditorActionListener(new OnEditorActionListener() {    //此方法用于添加对输入法完成动作的监听@Overridepublic boolean onEditorAction(TextView v, int actionId, KeyEvent event) {// TODO Auto-generated method stubif(actionId==EditorInfo.IME_ACTION_DONE){ //多个动作的监听在此处套用switch方法就行//do something 对事件做出相应处理return true;}return false;}});}


对于横屏下输入法,有个问题困扰着我,就是横屏模式看得见选框的情况下,输入中文无候选区,就是不能输入中文

如图:

1

这个真心有点坑爹,于是猜测是不是输入法问题,换成百度输入法测试,

效果如图

2

纳尼...百度输入法居然可以,难道真是输入法问题,还是不死心,

因为一个应用不能指望着别人安装了对应输入法才能正常使用,应当在系统输入法下也能成功才是健康的应用。

经过反复查找,在本机中找到了横屏输入中文成功的案例,一个是在短信界面,一个是在网页浏览界面,横屏下输入中文都能有候选字,

如图:

 3 4


这尼玛不是坑爹吗,图1图2表明了输入法差异,不是控件设置带来的不能输入中文,可是图1和图3图4却又反过来佐证同一个输入法横屏下是能输入中文的,输入法问题又不成立了,我凌乱了,除非是短信和浏览器的输入部分不是用edittext,而是自定义控件,这又是另一说。铁一般的事实啊。难道还需要设置哪里,这个真心不知道,困扰了很久,自己已无力琢磨。

貌似很多新手机都已经改良,自带输入法不会出现这种问题。

知道怎么修改能让显示中文的大侠,望不吝指点一番,感激不胜。

 

------补充,如图,edittext中输入表情

这里的用法和自定义链接一样,也是使用spannable,使用方式如下

 SpannableStringBuilder builder = new SpannableStringBuilder(text); builder.setSpan(new ImageSpan(context, resId,ImageSpan.ALIGN_BOTTOM),                       start(int), end(int),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

传入上下文和对应资源图片,替代相应位置的文字即可。

但是对于编辑删除输入的表情时,使用系统自带输入法的回退键可自动清除单个内容,但是在实际应用中我们需要在表情输入界面自定义删除图标,

此时如果定义光标处删除一个字符,是无法完整删除表情的,比如说字符"[惊讶]",使用表情替代后如果只删除一个字符,是没有效果的,需要连续点击四下,

很明显这样体验不行,所以应当在删除的点击事件中定义如下方法

 

//获取编辑器Editable editable=editText.getText();//获取当前光标位置int selectIndex=editText.getSelectionStart();//获取当前editText下的所有表情ImageSpan im[]=editable.getSpans(0, editable.length(), ImageSpan.class);//遍历表情for(ImageSpan is:im){//获取表情结束位置int spanEnd=editable.getSpanEnd(is);//与当前光标位置比较,相等就说明需要的是删除表情而不是一般字符if(spanEnd==selectIndex){editable.delete(editable.getSpanStart(is), selectIndex);return;}}//如果光标处不是表情,则删除一个字符if(selectIndex>0)editable.delete(selectIndex-1, selectIndex);


 

 

Textview 和Edittext 篇完结。



testend

0 0