android:怎么通过 Cntext查找我的iphoneView?

Android学习笔记之TextView边框使用说明-安卓教程-手机开发-壹聚教程网Android学习笔记之TextView边框使用说明在进行Android界面开发的时候,你想给TextView加个边框,找了半天发现没有这个属性,是不是有点蛋疼呢。下面就总结一下有哪些方法能够实现边框效果。
1.嵌套一层,利用内容的margin或者padding的留白加容器的背景来实现边框效果。
其实这个道理很简单,很早的时候那时候我们还用table做html页面布局的时候,我们就是使用cellspacing来实现table的边框的。现在我们也利用同样的想法来实现。
Android下实现边框效果 方案一
其中padding产生留白,就形成类似边框的效果。
&LinearLayout android:layout_width=&fill_parent& android:layout_height=&wrap_content& android:padding=&2px& android:background=&#f00&&
&TextView android:layout_width=&fill_parent& android:layout_height=&wrap_content& android:text=&Hello world!& android:background=&#000&&&/TextView&
&/LinearLayout&
当然内部的容器也是需要有颜色的,如果想实现内部透明的效果则需要将内部View的背景色跟背景的颜色保持一致,这是不太方便的地方。
2.使用9-patch(九宫格)的背景图片来实现边框效果。
做一个有边框的9-patch图片,作为要有边框的View的背景图即可。这样你还可以控制哪边有边框,哪边无边框,这种方法是比较好的一种方法,而且没有多余的View嵌套。另外你还可以实现圆角边框等效果。
Android下实现边框效果 方案二
如果你还不了解关于9-patch的内容,请移步。你需要做一个有边框的png图片,使用sdk的tools文件夹下的draw9patch.bat工具,你可以轻松生成9-patch图片。工具用起来很简单。左侧和顶部的线用于扩展重复显示的内容,右侧和底部的线用于控制内容显示的位置。在这里我要先感谢国家,我们现在已经可以自由的访问者站点。
3.利用shape的stroke来实现边框效果。
当然你可以使用shape中的stroke来实现border的效果。
&?xml version=&1.0& encoding=&utf-8&?&
&shape xmlns:android=&/apk/res/android&&
&stroke android:width=&1dp& android:color=&#f00& /&
然后你可以引用这个shape作为背景就可以实现边框效果。关于更多关于shape的内容请移步。
最终的效果展示:
当然还有很多其他的变通方法,比如你也可以添加一个view把宽度设置为1dp,作为边框。这个就需要你在实际开发中变通使用了。
上一页: &&&&&下一页:相关内容
虚拟手柄(Tincore KeyMapper)斩将封神编辑推荐
电脑壁纸相关专题解决TextView在中文和标点存在情况下一行没显示满就换行问题 - 迁移到
@Android @Java @性能优化 @开源 - ITeye技术网站
博客分类:
本文主要介绍如何用最简单的方法解决TextView在中文和标点存在情况下一行没显示满就突然换行问题,结果在行尾留下大段空格,造成整个页面布局不均匀。
具体原因:android源码中对换行的处理问题,Android换行算法参考Unicode的线断算法,对于字符显示在行首和行尾有严格控制,源码见。
解决方法:网上提供了如下四种方法
1、修改Android源码
2、自定义TextView
以上两种方法都过于复杂!解决此种问题杀鸡牛刀了,我们先往下看简单的,之后有兴趣可以见(本人未测试是否可行)。
3、将TextView内容所有字符转换为半角字符(可使用函数)。经过测试解决部分情况下异常换行,但改之后某些原本正常情况却异常换行了,失败!
4、设置TextView属性为单行显示android:singleLine="true",这个不看也知道会失败,内容都单行省略显示了。
在上面四种方法要么过于复杂要么失败后,看了下源码发现使用Unicode线断法折行是在if (w &= width)情况下,所以修改了TextView的android:layout_width为match_parent发现问题解决。
通常我们定义TextView会将android:layout_width设置为wrap_content,如下
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/&
但实际我们若TextView在其父View中独占一行时完全可以设置为match_parent(android不推荐使用fill_parent),如下
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/&
而在TextView并非父View单行独占情况下,可以使用属性
Android 开发进阶:
浏览 10511
浏览: 912356 次
来自: 杭州
不错,说的很全。学习了
中文加数字还是不行呀
多谢!!!!!!!!!!!!!!
这有些我开发过程遇到的最新问题及优化方案http://www. ...
lanxin_zxy_it 写道脑子里面有屎? 抄别人的干毛? ...现在网络的繁盛时代,光文字是不能满足人们的胃口的,图片,flash,音频,视频就成为浏览网页的主流显示,在手机上也一样。在手机上显示从网络端获取的数据显示,大家很自然的想起两种方式,一种就是webview,一种就是TextView。当然webView直接显示html页面就行了,我主要说的TextView显示html内容。
首先,说下TextView到底支持那些标签呢,通过对源码的查看,发现Textview可以解析一部分html标签,如:
&a&href="..."&&b&&big&&blockquote&&br&&cite&&dfn&&div&align="..."&&em&&font&size="..."&color="..."&face="..."&&h1&&h2&&h3&&h4&&h5&&h6&&i&&img&src="..."&&p&&small&&strike&&strong&&sub&&sup&&tt&&u&
大家想究其根本可以查看android.text.Html源码,其中有一段这样写:
private&void&handleStartTag(String&tag,&Attributes&attributes)&{&&&&&&&&if&(tag.equalsIgnoreCase("br"))&{&&&&&&&&&&&&//&We&don't&need&to&handle&this.&TagSoup&will&ensure&that&there's&a&&/br&&for&each&&br&&&&&&&&&&&&&//&so&we&can&safely&emite&the&linebreaks&when&we&handle&the&close&tag.&&&&&&&&}&else&if&(tag.equalsIgnoreCase("p"))&{&&&&&&&&&&&&handleP(mSpannableStringBuilder);&&&&&&&&}&else&if&(tag.equalsIgnoreCase("div"))&{&&&&&&&&&&&&handleP(mSpannableStringBuilder);&&&&&&&&}&else&if&(tag.equalsIgnoreCase("em"))&{&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Bold());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("b"))&{&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Bold());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("strong"))&{&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Italic());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("cite"))&{&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Italic());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("dfn"))&{&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Italic());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("i"))&{&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Italic());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("big"))&{&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Big());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("small"))&{&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Small());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("font"))&{&&&&&&&&&&&&startFont(mSpannableStringBuilder,&attributes);&&&&&&&&}&else&if&(tag.equalsIgnoreCase("blockquote"))&{&&&&&&&&&&&&handleP(mSpannableStringBuilder);&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Blockquote());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("tt"))&{&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Monospace());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("a"))&{&&&&&&&&&&&&startA(mSpannableStringBuilder,&attributes);&&&&&&&&}&else&if&(tag.equalsIgnoreCase("u"))&{&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Underline());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("sup"))&{&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Super());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("sub"))&{&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Sub());&&&&&&&&}&else&if&(tag.length()&==&2&&&&&&&&&&&&&&&&&&&&&&Character.toLowerCase(tag.charAt(0))&==&'h'&&&&&&&&&&&&&&&&&&&&&&tag.charAt(1)&&=&'1'&&&&tag.charAt(1)&&=&'6')&{&&&&&&&&&&&&handleP(mSpannableStringBuilder);&&&&&&&&&&&&start(mSpannableStringBuilder,&new&Header(tag.charAt(1)&-&'1'));&&&&&&&&}&else&if&(tag.equalsIgnoreCase("img"))&{&&&&&&&&&&&&startImg(mSpannableStringBuilder,&attributes,&mImageGetter);&&&&&&&&}&else&if&(mTagHandler&!=&null)&{&&&&&&&&&&&&mTagHandler.handleTag(true,&tag,&mSpannableStringBuilder,&mReader);&&&&&&&&}&&&&}&&&&private&void&handleEndTag(String&tag)&{&&&&&&&&if&(tag.equalsIgnoreCase("br"))&{&&&&&&&&&&&&handleBr(mSpannableStringBuilder);&&&&&&&&}&else&if&(tag.equalsIgnoreCase("p"))&{&&&&&&&&&&&&handleP(mSpannableStringBuilder);&&&&&&&&}&else&if&(tag.equalsIgnoreCase("div"))&{&&&&&&&&&&&&handleP(mSpannableStringBuilder);&&&&&&&&}&else&if&(tag.equalsIgnoreCase("em"))&{&&&&&&&&&&&&end(mSpannableStringBuilder,&Bold.class,&new&StyleSpan(Typeface.BOLD));&&&&&&&&}&else&if&(tag.equalsIgnoreCase("b"))&{&&&&&&&&&&&&end(mSpannableStringBuilder,&Bold.class,&new&StyleSpan(Typeface.BOLD));&&&&&&&&}&else&if&(tag.equalsIgnoreCase("strong"))&{&&&&&&&&&&&&end(mSpannableStringBuilder,&Italic.class,&new&StyleSpan(Typeface.ITALIC));&&&&&&&&}&else&if&(tag.equalsIgnoreCase("cite"))&{&&&&&&&&&&&&end(mSpannableStringBuilder,&Italic.class,&new&StyleSpan(Typeface.ITALIC));&&&&&&&&}&else&if&(tag.equalsIgnoreCase("dfn"))&{&&&&&&&&&&&&end(mSpannableStringBuilder,&Italic.class,&new&StyleSpan(Typeface.ITALIC));&&&&&&&&}&else&if&(tag.equalsIgnoreCase("i"))&{&&&&&&&&&&&&end(mSpannableStringBuilder,&Italic.class,&new&StyleSpan(Typeface.ITALIC));&&&&&&&&}&else&if&(tag.equalsIgnoreCase("big"))&{&&&&&&&&&&&&end(mSpannableStringBuilder,&Big.class,&new&RelativeSizeSpan(1.25f));&&&&&&&&}&else&if&(tag.equalsIgnoreCase("small"))&{&&&&&&&&&&&&end(mSpannableStringBuilder,&Small.class,&new&RelativeSizeSpan(0.8f));&&&&&&&&}&else&if&(tag.equalsIgnoreCase("font"))&{&&&&&&&&&&&&endFont(mSpannableStringBuilder);&&&&&&&&}&else&if&(tag.equalsIgnoreCase("blockquote"))&{&&&&&&&&&&&&handleP(mSpannableStringBuilder);&&&&&&&&&&&&end(mSpannableStringBuilder,&Blockquote.class,&new&QuoteSpan());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("tt"))&{&&&&&&&&&&&&end(mSpannableStringBuilder,&Monospace.class,&&&&&&&&&&&&&&&&&&&&new&TypefaceSpan("monospace"));&&&&&&&&}&else&if&(tag.equalsIgnoreCase("a"))&{&&&&&&&&&&&&endA(mSpannableStringBuilder);&&&&&&&&}&else&if&(tag.equalsIgnoreCase("u"))&{&&&&&&&&&&&&end(mSpannableStringBuilder,&Underline.class,&new&UnderlineSpan());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("sup"))&{&&&&&&&&&&&&end(mSpannableStringBuilder,&Super.class,&new&SuperscriptSpan());&&&&&&&&}&else&if&(tag.equalsIgnoreCase("sub"))&{&&&&&&&&&&&&end(mSpannableStringBuilder,&Sub.class,&new&SubscriptSpan());&&&&&&&&}&else&if&(tag.length()&==&2&&&&&&&&&&&&&&&&&&&Character.toLowerCase(tag.charAt(0))&==&'h'&&&&&&&&&&&&&&&&&&&tag.charAt(1)&&=&'1'&&&&tag.charAt(1)&&=&'6')&{&&&&&&&&&&&&handleP(mSpannableStringBuilder);&&&&&&&&&&&&endHeader(mSpannableStringBuilder);&&&&&&&&}&else&if&(mTagHandler&!=&null)&{&&&&&&&&&&&&mTagHandler.handleTag(false,&tag,&mSpannableStringBuilder,&mReader);&&&&&&&&}&&&&}
通过源码可以看到,除了默认的一些标签,其还支持自定义标签;看下面代码:
else&if&(mTagHandler&!=&null)&{&&&&&&&&&&&&mTagHandler.handleTag(false,&tag,&mSpannableStringBuilder,&mReader);&&&&&&&&}
系统会调用mTagHandler的handleTag方法。所以,我们可以实现此接口,来解析自己定义的标签类型。
具体的,自己可以看一下下面实例:
package&com.mxgsa.import&org.xml.sax.XMLRimport&android.content.Cimport&android.content.Iimport&android.text.Eimport&android.text.Html.TagHimport&android.text.Simport&android.text.style.ClickableSimport&android.view.Vimport&android.view.View.OnClickLpublic&class&MxgsaTagHandler&implements&TagHandler{&&&&private&int&sIndex&=&0;&&&&&&private&&int&eIndex=0;&&&&private&final&Context&mC&&&&&&&&public&MxgsaTagHandler(Context&context){&&&&&&&&mContext=&&&&}&&&&&&&&public&void&handleTag(boolean&opening,&String&tag,&Editable&output,&XMLReader&xmlReader)&{&&&&&&&&//&TODO&Auto-generated&method&stub&&&&&&&&if&(tag.toLowerCase().equals("mxgsa"))&{&&&&&&&&&&&&if&(opening)&{&&&&&&&&&&&&&&&&sIndex=output.length();&&&&&&&&&&&&}else&{&&&&&&&&&&&&&&&&eIndex=output.length();&&&&&&&&&&&&&&&&output.setSpan(new&MxgsaSpan(),&sIndex,&eIndex,&Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);&&&&&&&&&&&&}&&&&&&&&}&&&&}&&&&private&class&MxgsaSpan&extends&ClickableSpan&implements&OnClickListener{&&&&&&&&@Override&&&&&&&&public&void&onClick(View&widget)&{&&&&&&&&&&&&//&TODO&Auto-generated&method&stub&&&&&&&&&&&&//具体代码,可以是跳转页面,可以是弹出对话框,下面是跳转页面&&&&&&&&&&&&mContext.startActivity(new&Intent(mContext,MainActivity.class));&&&&&&&&}&&&&}}
调用页面:
package&com.mxgsa.import&android.app.Aimport&android.os.Bimport&android.text.Himport&android.text.method.LinkMovementMimport&android.widget.TextVpublic&class&MxgsaActivity&extends&Activity{&&&&private&TextView&tV&&&&@Override&&&&public&void&onCreate(Bundle&savedInstanceState)&{&&&&&&&&super.onCreate(savedInstanceState);&&&&&&&&setContentView(R.layout.mxgsa_activity);&&&&&&&&findControl();&&&&&&&&setData();&&&&}&&&&private&void&findControl()&{&&&&&&&&tView&=&(TextView)&findViewById(R.id.tvImage);&&&&}&&&&private&void&setData()&{&&&&&&&&//&TODO&Auto-generated&method&stub&&&&&&&&final&String&sText&=&"测试自定义标签:&br&&h1&&mxgsa&测试自定义标签&/mxgsa&&/h1&";&&&&&&&&tView.setText(Html.fromHtml(sText,&null,&new&MxgsaTagHandler(this)));&&&&&&&&tView.setClickable(true);&&&&&&&&tView.setMovementMethod(LinkMovementMethod.getInstance());&&&&}&&&&}
阅读(...) 评论()35177人阅读
TextView实现文字滚动需要以下几个要点:
1.文字长度长于可显示范围:android:singleLine="true"
2.设置可滚到,或显示样式:android:ellipsize="marquee"
3.TextView只有在获取焦点后才会滚动显示隐藏文字,因此需要在包中新建一个类,继承TextView。重写isFocused方法,这个方法默认行为是,如果TextView获得焦点,方法返回true,失去焦点则返回false。跑马灯效果估计也是用这个方法判断是否获得焦点,所以把它的返回值始终设置为true。
以下转自他人:
Java语言:&
public&class&AlwaysMarqueeTextView&extends&TextView&{
public&AlwaysMarqueeTextView(Context&context)&{super(context);}
public&AlwaysMarqueeTextView(Context&context,&AttributeSet&attrs)&{super(context,&attrs);}
public&AlwaysMarqueeTextView(Context&context,&AttributeSet&attrs,&int&defStyle)&{super(context,&attrs,&defStyle);}
@Overridepublic&boolean&isFocused()&{return&true;}
在布局XML文件中加入这么一个AlwaysMarqueeTextView,这个加入方法也是刚刚学的。
&com.examples.AlwaysMarqueeTextViewandroid:id=&@+id/AMTV1&Pandroid:layout_width=&fill_parent&android:layout_height=&wrap_content&android:lines=&1&Pandroid:focusable=&true&android:focusableInTouchMode=&true&android:scrollHorizontally=&true&android:marqueeRepeatLimit=&marquee_forever&android:ellipsize=&marquee&android:background=&@android:color/transparent&/&
ellipsize属性设置当文字过长时,该控件该如何显示。有如下值设置:&start&&&省略号显示在开头;&end&&&省略号显示在结尾;&middle&&-省略号显示在中间;&marquee& &&以跑马灯的方式显示(动画横向移动)
marqueeRepeatLimit属性在ellipsize指定marquee的情况下,设置重复滚动的次数,当设置为marquee_forever时表示无限次。
focusable属性自己猜测的,应该是能否获得焦点,同样focusableInTouchMode应该是滑动时能否获得焦点。
组合View的问题:
& LinearLayoutxmlns:android =&/apk/res/android&android:orientation =&vertical&android:gravity =&center_vertical&android:background =&@drawable/f_background&android:layout_width =&fill_parent&android:focusable =&true&android:layout_height =&50px&&&& TextViewandroid:id =&@+id/info_text&android:focusable =&true&android:layout_width =&fill_parent&android:layout_height =&wrap_content&android:text =&test marquee& .. &android:textColor =&@color/black&android:singleLine =&true&android:ellipsize =&marquee&android:marqueeRepeatLimit =&3&Pandroid:textSize =&18sp&/&& TextViewandroid:id =&@+id/date_text&android:layout_width =&fill_parent&android:layout_height =&wrap_content&android:layout_gravity =&bottom&android:textColor =&@color/gray&android:text =&&Pandroid:textSize =&12sp&/&&/ LinearLayout &
上面示例中2个TextView组合为一个View,由于设置了LinearLayout为focusable而TextView就没法取得焦点了,这样 这个TextView的跑马灯效果就显示不出来,就算你也设置TextView的&android:focusable="true"&也是 没用的. 这个时候就要使用addStatesFromChildren 这个属性了,在LinearLayout中设置这个属性,然后设置TextView的focusable=&"true"&就可以了.关于 addStatesFromChildren的说明:
Sets whether&this&ViewGroup's drawable states&also include its children's drawable states.
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

我要回帖

更多关于 interview 的文章

 

随机推荐