android字符串超链接,Android中TextView的详细使用解析(一) 超链接的处理
具有载入和载出动画的TextView效果图:关于倒计时分析可点击查看布局文件设置:android:layout_width="match_parent"android:layout_height="match_parent">android:id="@+id/textSwitcher"android:background="#e6e6e6"android:layout_width="100d
具有载入和载出动画的TextView
效果图:
关于倒计时分析可点击查看
布局文件设置:
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/textSwitcher"
android:background="#e6e6e6"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true" />
java代码中的设置:
public class TextSwitchActivity extends Activity {
private TextSwitcher textSwitcher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_text_switch);
textSwitcher = (TextSwitcher)findViewById(R.id.textSwitcher);
/**
* 初始化倒计时类
*/
TimeCount timeCount=new TimeCount(100*1000,1000);
/**
* 文字加载动画
*/
textSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.textswitcher_in));//载入动画
/**
* 设置文字退出动画
*/
textSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.textswitcher_out));//载入动画
textSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
@Override
public View makeView() {
TextView textView = new TextView(TextSwitchActivity.this);
/**
* 设置字体颜色
*/
textView.setTextColor(Color.RED);//
/**
* 设置字体大小
*/
textView.setTextSize(40);
/**
* 设置内边距
*/
textView.setPadding(10,10,10,10);
/**
* 设置字体居中
*/
textView.setGravity(Gravity.CENTER);
/**
* 设置TextView 宽高属性
*/
textView.setLayoutParams(new TextSwitcher.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));//设置宽高属性
return textView;
}
});
timeCount.start();//倒计时类开始
}
private int count;
class TimeCount extends CountDownTimer {//倒计时类
public TimeCount(long millisInFuture, long countDownInterval) {//必须重载的构造方法
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long millisUntilFinished) {//计时过程中触发
count=(int)millisUntilFinished/1000;
textSwitcher.setText(count+"");
}
@Override
public void onFinish() {//计时结束时触发
textSwitcher.setText("Dead");
}
}
}
使用到的动画文件 :
载入动画设置:
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="800"
android:fromXScale="1.0"
android:toXScale="1.0"
android:fromYScale="0.0"
android:toYScale="1.0"
android:pivotX="0.5"
android:pivotY="100%"/>
退出动画设置:
android:duration="800"
android:fromXScale="1.0"
android:toXScale="0.5"
android:fromYScale="1.0"
android:toYScale="0.0"
android:pivotX="0.5"
android:pivotY="0%"/>
TextView中 对于特殊字符的自动处理
例如 自动识别 网址 电话号码 邮箱等
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoLink="all"
android:text="@string/hello_world" />
上面的这个textView就会自动地去识别其中的特殊字符,识别后,如果可以自动的调用系统的默认的浏览器,拨号器等进行处理
这里面配制了属性autoLink
该属性可设置的属性值如下:
none:不匹配任何链接(默认)
web:匹配Web网址
email:匹配E-mail地址
phone:匹配电话号码
map:匹配映射地址
all:匹配所有的链接
这里配制的是all,也就是可以支持自动识别所有的链接
例如:
TextView textView = (TextView) findViewById(R.id.textview);
w.setText("我的博客:http://blog.csdn.net/zl18603543572 \n\n 我的电话 186******* \n\n 我的邮箱 928343994@qq.com");
在显示出来的页面中 点击相应的条目,就会打开系统默认的 浏览器 或者是系统默认的拨号器或者是发送邮件的应用
拦截打开系统默认的这些应用
也就是说在点击链接的时候,指定打开的浏览器,或者是在自己的应用中打开相应的页面
// 实现超文本链接的点击 拦截
private void SetLinkClickIntercept(TextView textView) {
textView.setMovementMethod(LinkMovementMethod.getInstance());
CharSequence text = textView.getText();
if (text instanceof Spannable) {
int end = text.length();
Spannable sp = (Spannable) textView.getText();
URLSpan[] urls = sp.getSpans(0, end, URLSpan.class);
if (urls.length == 0) {
return;
}
SpannableStringBuilder spannable = new SpannableStringBuilder(text);
// 只拦截 http:// URI
LinkedList myurls = new LinkedList();
for (URLSpan uri : urls) {
String uriString = uri.getURL();
if (uriString.indexOf("http://") == 0 || uriString.indexOf("https://") == 0) {
myurls.add(uriString);
}
}
// 循环把链接发过去
for (URLSpan uri : urls) {
String uriString = uri.getURL();
if (uriString.indexOf("http://") == 0 || uriString.indexOf("https://") == 0) {
MyURLSpan myURLSpan = new MyURLSpan(uriString, myurls);
spannable.setSpan(myURLSpan, sp.getSpanStart(uri), sp.getSpanEnd(uri),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
}
textView.setText(spannable);
}
}
/**
* 处理TextView中的链接点击事件 链接的类型包括:url,号码,email,地图 这里只拦截url,即 http:// 开头的URI 处 https://开头的URI
*/
private class MyURLSpan extends ClickableSpan {
private String mUrl; // 当前点击的实际链接
private LinkedList mUrls; // 根据需求,一个TextView中存在多个link的话,
// 无论点击哪个都必须知道该TextView中的所有link,因此添加改变量
MyURLSpan(String url, LinkedList urls) {
mUrl = url;
mUrls = urls;
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(ds.linkColor);
ds.setUnderlineText(false); // 去掉下划线
ds.setColor(Color.parseColor("#034198")); //设置超链接颜色
}
@Override
public void onClick(View widget) {
// 这里你可以做任何你想要的处理
// 比如在你自己的应用中用webview打开,而不是打开系统的浏览器
String info = new String();
if (mUrls.size() == 1) {
// 只有一个url,根据策略弹出提示对话框
info = mUrls.get(0);
} else {
// 多个url,弹出选择对话框,意思一下
info = mUrls.get(0) + "\n" + mUrls.get(1);
}
// Uri uri = Uri.parse(mUrl);
// Intent intent = new Intent(Intent.ACTION_VIEW, uri);
// context.startActivity(intent);
这里可以设置你要进行的操作
}
}}
在使用的时候可以直接将上面的拦截操作的代码复制就行
当然也可以解析相应的html文件
String htmlString ="i love you
";
htmlString+="我的百度";
CharSequence sequence = Html.fromHtml(htmlString);
//设置要显示的文本
mTextView.setText(sequence);
//必须进行下面的设置,否则点击链接无法进行浏览器的中转浏览
mTextView.setMovementMethod(LinkMovementMethod.getInstance());
如果不进行setMovementMethod方法设置,是可以正常显示链接的
关于解析html的源码分析
这里用到的Html.fromHtml()方法,在源码中
public static Spanned fromHtml(String source) {
return fromHtml(source, null, null);
}
public static Spanned fromHtml(String source, ImageGetter imageGetter,
TagHandler tagHandler) {
Parser parser = new Parser();
try {
parser.setProperty(Parser.schemaProperty, HtmlParser.schema);
} catch (org.xml.sax.SAXNotRecognizedException e) {
// Should not happen.
throw new RuntimeException(e);
} catch (org.xml.sax.SAXNotSupportedException e) {
// Should not happen.
throw new RuntimeException(e);
}
HtmlToSpannedConverter converter =
new HtmlToSpannedConverter(source, imageGetter, tagHandler,
parser);
return converter.convert();
}可以看到这里有两个重载的方法 ,不过最终都是调用到了多参数的那个方法
其中涉及到的第一个参数source就是带标签的html文字, formHtml方法中 使用到HtmlToSpannedConverter这个类,这个类是用来转换html文本的,这个类就 定义在Html.Java中,
在HtmlToSpannedConverter类中,我们很容易的找到两个方法
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 for each
// 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("strong")) {
start(mSpannableStringBuilder, new Bold());
} else if (tag.equalsIgnoreCase("b")) {
start(mSpannableStringBuilder, new Bold());
} else if (tag.equalsIgnoreCase("em")) {
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) {
...
}
可以看到这两个方法就是用于分析html文本的开头与结尾
设置固定文字的背景颜色
private void setTextViewBackground(){
String test = "设置固定部分的字符串的背景颜色....";
//将字符串转换成SpannableString对象
SpannableString spannableString = new SpannableString(test);
//确定要设置的子字符串的开始位置和结束位置
int start = 2;
int end = 6;
//创建BackgroundColorSpan对象
BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.BLUE);
//使用setSpan方法 将指定的子字符串转换成BackgroundColorSpan对象
spannableString.setSpan(backgroundColorSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置显示到textView上
mTextView2.setText(spannableString);
}
设置固定文字的背景色 与 显示 颜色
private void setTextViewBackGroudnAndTextColor(){
String test = "设置固定部分的字符串的背景颜色以及字体的颜色....";
//将字符串转换成SpannableString对象
SpannableString spannableString = new SpannableString(test);
//确定要设置的子字符串的开始位置和结束位置
int start = 2;
int end = 6;
//创建BackgroundColorSpan对象
ColorSpan backgroundColorSpan = new ColorSpan(Color.BLUE,Color.YELLOW);
//使用setSpan方法 将指定的子字符串转换成BackgroundColorSpan对象
spannableString.setSpan(backgroundColorSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置显示到textView上
mTextView3.setText(spannableString);
}
class ColorSpan extends CharacterStyle{
private int mTextColor;
private int mBackgroundColor;
public ColorSpan(int textColor,int backgroundColor){
ColorSpan.this.mBackgroundColor = backgroundColor;
ColorSpan.this.mTextColor = textColor;
}
@Override
public void updateDrawState(TextPaint tp) {
//设置背景颜色
tp.bgColor = mBackgroundColor;
//设置显示字体的颜色
tp.setColor(mTextColor);
}
}
updateDrawState(TextPaint tp)会在系统设置指定文字样式之前调用,以修改绘制文字的属性
TextView中设置文字的行间距
在布局文件中使用android:lineSpacingExtra
android:lineSpacingExtra="20dp"
第一行文本与第二文本之间的行间距是20dp
在布局文件中使用android:lineSpancingMultiplier属性
android:lineSpancingMltiplier = “1.8”第一行文本与第二行文本之间的行间距是默认的行间距的1.8倍
使用用style
1.5
使用setLineSpancing方法设置
textView.setLineSpacing(50,1.2f);
这里面有两个参数,第一个相当于Android:lineSpacingExtra属性,第二个参数相当于android:lineSpancingMultiplier属性,系统会采用表示行间距大的那个值
在TextView中设置省略号
当文字过多的时候 ,我们可以在文字的最后 或者是最前面或者 是中间添加省略号
使用的时候就是在TextView中设置属性ellipsize
在开头设置省略号
android:ellipsize="middle"
在中间设置省略号
android:ellipsize="start"
在结尾设置省略号
android:ellipsize="end"
不显示省略号
android:ellipsize="none"
这是在布局文件中进行设置
在代码中进行设置
textView.setEllipsize(TextUtils.TruncateAt.END);
TextView设置走马灯的效果
http://blog.csdn.net/zl18603543572/article/details/49980623
TextView设置滚动效果
android:id="@+id/txtview4"
android:scrollbars="vertical"
android:scrollbarStyle="insideOverlay"
android:scrollbarFadeDuration="5000"
android:maxLines="4"
android:padding="10dp"
android:textSize="20sp"
android:layout_marginTop="10dp"
android:singleLine="false"
android:text="@string/textstring_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
其中:
scorllbarFadeDuration 设置的是滚动条从出现到消失的时间 ,单位是毫秒;
在布局文件中设置后,在代码中还必须设置
mTextView4.setMovementMethod(ScrollingMovementMethod.getInstance());
EditText中输入表情
public void addFaceEmotionClick(View view){
//随机产生1到44的整数
int randomId = 1+new Random().nextInt(44);
try {
//根据随机产生的整数从R.drawable类中获得相应资源ID的Field对象
Field field = R.drawable.class.getDeclaredField("ee_" + randomId);
//获得资源ID的值
int resurceId = Integer.parseInt(field.get(null).toString());
//根据资源ID获得资源图像的Bitmap对象
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),resurceId);
//根据bitmap对象创建imagespan对象
ImageSpan imageSpan = new ImageSpan(this,bitmap);
//创建spannableString对象,插入用Imagespan对象封装的图像
SpannableString spannableString = new SpannableString("ee_");
//用imageSpan对象替换ee_
spannableString.setSpan(imageSpan,0,3,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//将随机获得的图像追加到EditText控件的最后
mEditText.append(spannableString);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
这里面使用到的"ee_" 是文件中的表情的名称
使用field.get方法来获取值的时候,如果获取的是静态变量,field.get方法的值设为Null即可,如果不是静态变量,需要指定一个变量所在的对象为值
EditTex中不能直接插入span对象,因此需要先使用SpannableString对象封装span对象,然后再将SpannableString对象插入到EditText控件中
设置下面的这个方法,弹出的系统软件盘不会遮挡文字的输入框
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
效果图
源码:
更多推荐
所有评论(0)