下面小编给大家整理的Android开发之TextView高级应用,本文共9篇,欢迎阅读!

篇1:Android开发之TextView高级应用
我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此,下面就和大家分享一下TextView的一些使用技巧。
Android中设置文本样式的几种方法:
1.将android:autoLink属性值设为true。系统会自动识别E-mail、电话、网址等特殊文本。
2.使用Html标签,例如,、等。不要设置 android:autoLink 属性。
3.在Java代码中直接使用Span对象来设置文本样式。这种方法需要将文本转换成一个SpannableString或SpannableStringBuilder对象,然后在SpannableString或SpannableStringBuilder对象中使用setSpan方法将要设置样式的文本转换成相应的Span对象。
4.在字符串资源中使用标签(只支持标签)设置可单击的链接,不要设置android:audoLink属性。
上面4种方法只要涉及单击动作,就必须使用TextView.setMovementMethod方法设置相应的MovementMethod对象。
1.在TextView中显示图像
我们浏览网的时候,上面的有很多图文并茂的文章,这些文章大部分都是从服务器的数据库中取出并显示在网页上的。那么如何在网页上显示图文并茂的文章呢?有过Java Web或.NET开发经验的人,会说用s:textfield或asp:label绑定。用它们是因为它们可以将标签的src对应的图像地址(也是图像资源的唯一标识)直接交给浏览器出处理。这样就可以将的src对应的图片显示出来。那么,在Android中如何用TextView显示图片呢?
在解析Html标签来方面Android系统没有浏览器那么强大,Android系统不会直接根据src属性说指向的的值自动获取并显示图片,这一切都需要我们来帮它来完成。说白了,src属性指的是什么只有开发者自己知道。开发者需要告诉系统src属性到底指的是什么,然后系统才会知道怎么做。
解析src属性值需要ImageGetter对象的getDrawable方法来完成。ImageGetter是一个接口。使用Html.fromHtml会使这一过程变得简单。(关于Html.fromHtml的介绍)
txtShow=(TextView)findViewById(R.id.txtShow);
String htmlText=“小黄人1号:” +“小黄人2号:”+“小黄人3号:”;
txtShow.setText(getSpanned(htmlText));/**
*将Html解析成样式文本
*@return spanned Spanned
* */
private Spanned getSpanned(String htmlText) {
//TODO Auto-generated method stub
Spanned spanned=Html.fromHtml(htmlText,new ImageGetter { @Override
public Drawable getDrawable(String source) {
//TODO Auto-generated method stub
//装在图像资源
Drawable drawable=getResources().getDrawable(getResourceId(source));
if(source.equals(“blog.csdn.net/fengyuzhengfan/article/details/xiaohuangren1”)) {
//设置图像的缩放
drawable.setBounds(0, 0, 56, 56);
}elseif(source.equals(“blog.csdn.net/fengyuzhengfan/article/details/xiaohuangren2”)) {
//设置图像的缩放
drawable.setBounds(0, 0, 36, 36);
}elseif(source.equals(“blog.csdn.net/fengyuzhengfan/article/details/xiaohuangren3”)) {
//设置图像缩放到原来的75%
drawable.setBounds(0, 0,(int) (drawable.getIntrinsicWidth()*0.75),
(int) (drawable.getIntrinsicHeight()*0.75));
}
return drawable;
}
},null);
return spanned;
}
/**
*利用反射技术从R.drawable类中通过图像资源文件名获得相应图像资源的ID
*@param name String图像资源名
*@return图像资源ID int
* */
protectedint getResourceId(String name) {
//TODO Auto-generated method stub
try {
//根据资源ID的变量名(也就是图像资源的文件名)获取Field对象
Field field=R.drawable.class.getField(name);
//取得并返回资源ID的值
return Integer.parseInt(field.get(null).toString());
}catch (Exception e) {
//TODO: handle exception
}
return 0;
}
2.单击TextView中的内容打开指定Activity
虽然TextView可以自动识别特殊文本(网址、电话号、E-mail等),并可以通过单击触发不同的动作,但是如果开发者想通过单击链接来显示指定的组件(如Activity、Service等)那么怎么来实现呢?TextView自动识别的网址、电话号、E-mail等,都是在ClickableSpan类的onClick方法中通过Action调用相应的组件来实现的。现在我们就采用类似的方法,通过自己实现onClick方法来达到自定义自定义单击动作的目的。
/**
*单击TextView中的内容启动指定组件
* */
privatevoid launchComponentByTextView() {
//TODO Auto-generated method stub
txtLink=(TextView)findViewById(R.id.txtLink);
String str=“单击我启动一个Activity”;
//将文本转换成SpannableString对象
SpannableString spannableString=new SpannableString(str);
//将spannableString所有文本设置成ClickableSpan对象,并实现onClick方法
spannableString.setSpan(new ClickableSpan() {
@Override
publicvoid onClick(View widget) {
//TODO Auto-generated method stub
//启动指定Activity
Intent intent=new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
}, 0, str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
txtLink.setText(spannableString);
//在单击链接时凡是要执行的动作,都必须设置MovementMethod对象
txtLink.setMovementMethod(LinkMovementMethod.getInstance());
}实例分析:
篇2:android应用开发就业前景
Android是目前市场上占有率最大,全球覆盖率最广的手机操作系统,拥有相当多的手机用户群,所以对于Android相关的应用软件也有着相当大的需 求量。为了开发功能更丰富,应用更强大的软件,企业急需招聘Android技术人才。而Android进入中较晚,人才缺口达30万,很多企业不惜高薪挖 角,Android开发工程师的工资也是水涨船高。所以如果选择一家专业的机构培训,学习与企业需求相契合的技术,毕业后完全不用担心找不到工作。像武汉 大学深圳研究院毕业的学员,平均薪水都在五千以上,加之相关福利,完全可以满足大学生的心里预期。
小王毕业于北京某一大专院校,是武汉大学深圳研究院的android学员,目前就职于深圳某知名手机软件开发公司,从事Android开发。
他在大学时候学的是软件技术,大家都知道做技术的没有一定的项目经验和非常好的基础是很难找到工作的,毕业以后小王找了很多的公司面试,但都是因为没有项目实战经验,面试均以失败告终。于是他就有了参加培训的想法。
一次偶然的机会,他看到了武汉大学深圳研究院Mark老师的Android教学视频,他被Mark老师的教学风格深深吸引了,所以他就选择了武汉大学 深圳研究院Android开发培训。每天武汉大学深圳研究院的同学们都拼命的学,刚开始的时候小王还有点不适应,因为在学校的时候大家都懒散惯了,后来就 适应了,而且每天都很充实,这种充实的感觉让他似曾相识,感觉非常的好。在武汉大学深圳研究院学了4个月后,小王经过武汉大学深圳研究院相关老师的推荐找 到了公司,从事android开发对口工作。因为有了目标。让他对未来充满了希望。
武汉大学深圳研究院Android开发课程学时四个月,学员学习后可以掌握实用性最强、最新的技术,具备独立开发项目的能力。不再是空有一张文凭的文 弱书生,而是有项目经验,技术过关的开发人才。不但可以就职理想的公司,薪水也高出同届毕业生。今天迈出一小步,也许就是未来通向成功的一大步!随着 Android开发技术的不断壮大,未来Android开发工程师必将成为含金量最高的职业。
[android应用开发就业前景]
篇3:高级android开发工程师岗位职责优秀
1、根据产品需求完成相关产品功能开发 ;
2、独立完成Android客户端程序相关模块的设计和开发工作;
3、验证和修正测试中发现的问题 ;
4、完成产品功能和技术需求方面的优化 ;
篇4:高级android开发工程师岗位职责优秀
1、负责雪球移动产品的开发, 深度参与需求讨论, 编写高质量的代码和文档;
2、开发并维护公共库、性能调优;
3、关注技术架构的改进、风险控制等;
4、承担系统设计、技术选型、项目重构, 跨组协调等工作;
5、指导并带领初级工程师共同完成开发任务。
篇5:高级android开发工程师岗位职责优秀
1.负责公司移动端Android的软件系统架构分析、设计及实现;
2.分析业务需求,参与系统设计与开发;
3.参与公司前端技术架构和关键技术的攻关;
4.参与项目设计与编码实现,跟踪并研究Android新技术的发展,并将成果实际应用到产品中;
5.对开发代码进行调试及测试,修复测试发现代码缺陷,确保质量;
6.参与团队未来技术方向研究与制定。
篇6:Android开发UI之Button
前言
最近一直在讲androidUI控件的使用方式,这篇文章讲解一下基本上属于用处最广泛的控件之一的Button控件,如果有过其他平台开发经验的程序员,对按钮是不会陌生的。本篇文章首先讲解一下Android的Button控件的常用事件以及事件绑定和触发,再在Button控件中通过设定属性值来实现图文混排,这个功能是在项目中常用到的。
Button控件
Button继承了TextView。它的功能就是提供一个按钮,这个按钮可以供用户点击,当用户对按钮进行操作的时候,触发相应事件,如点击,触摸。
还有一个ImageButton,它继承自Button,可以在ImageButton中显示一个图片展示给用户看,并且对其Text属性设置值的时候是无效的,其它功能与Button一样。
常用事件
一般对于一个按钮而言,用的最多的就是点击事件,Button间接继承自View,而AndroidUI中的所有事件,都是定义在View中的。在本篇博客中,示例讲解的点击事件、触摸事件,其他事件的使用方式与此类似,只是触发的时机不同而已。此处分别需要实现View.OnClickListener、View.OnTouchListener接口的方法。
View.OnClickListener,需要实现onClick(View v)方法,其中v为当前触发事件的控件。
View.OnTouchListener,需要实现onTouch(View v , MotionEvent event),其中v为当前触发事件的控件,event包括了触摸时的具体内容,如移动、按下等。
下面使用一个示例讲解一下事件的绑定及触发,在示例中显示两个按钮控件,一个为普通按钮,一个为填充图片的按钮,为它们绑定click事件,当点击事件触发的时候,对其尺寸进行修改,为图片按钮绑定触摸事件,当触摸的时候触发,切换图片显示。
布局代码:
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical” >
android:id=“@+id/btnChangeSize”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“点击修改尺寸”
/>
android:id=“@+id/btnChangeImg”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:background=“@drawable/image1”
/>
实现代码:
package com.bgxt.buttondemo;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
//通过实现接口,对其进行click、touch事件的支持
public class ButtonListener extends Activity implements OnClickListener,
OnTouchListener {
private Button btnChangeSize;
private Button btnChangeImg;
private int flag = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.btn_listener);
btnChangeSize = (Button) findViewById(R.id.btnChangeSize);
btnChangeImg = (Button) findViewById(R.id.btnChangeImg);
// 对两个按钮进行事件绑定
btnChangeSize.setOnClickListener(this);
btnChangeImg.setOnClickListener(this);
btnChangeImg.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// 获取触发事件的Button控件
Button btn = (Button) v;
if (event.getAction == MotionEvent.ACTION_UP) {
// 当触摸时按下,则替换展示图片为image1
btn.setBackgroundResource(R.drawable.image1);
} else {
btn.setBackgroundResource(R.drawable.image2);
}
return false;
}
@Override
public void onClick(View v) {
Button btn = (Button) v;
if (flag == 1
&& btn.getWidth() == getWindowManager().getDefaultDisplay()
.getWidth()) {
// 如果等于屏幕的宽度,则修改标识flag为-1
flag = -1;
} else if (flag == -1 && btn.getWidth() < 100) {
flag = 1;
}
篇7:Android开发之ProgressDialog的使用
ProgressDialog类似于ProgressBar类,
用于显示一个过程,通常用于耗时操作。
几个方法介绍:
1.setMax()
设置对话框中进度条的最大值。
2.setTile()
设置标题。
3.setProgressStyl()
设置对话框中进度条的样式。例如:环形和水平。
参数:
ProgressDialog.STYLE_SPINNER 环形精度条
ProgressDialog.STYLE_HORIZONTAL 水平样式的进度条
4.setMessage()
设置显示的内容。
演示实例:
用于模拟一个耗时的连接操作。
图:
MainActivity.java
public class MainActivity extends Activity { Button button, button2; ProgressDialog progressDialog; public final static String ABOUT_SERVER = “Connect”; // 信息广播接收 BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context c, Intent intent) { String str = intent.getStringExtra(“DATA”); if (str.equals(“0”)) { progressDialog.setMessage(“开始连接”); } else if (str.equals(“1”)) { progressDialog.setMessage(“连接完毕”); } else { progressDialog.dismiss(); } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册广播监听 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ABOUT_SERVER); registerReceiver(broadcastReceiver, intentFilter); } public void click(View v) { progressDialog = new ProgressDialog(MainActivity.this); progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); progressDialog.setMessage(“准备建立连接·············”); progressDialog.show(); Intent intent = new Intent(MainActivity.this, ServerActivity.class); startService(intent); }}activity_main.xml
ServerActivity.java
public class ServerActivity extends Service { Handler handler = new Handler() { public void handleMessage(Message msg) { Intent intent = new Intent(MainActivity.ABOUT_SERVER); if (msg.what == 0) { intent.putExtra(“DATA”, “0”); } else if (msg.what == 1) { intent.putExtra(“DATA”, “1”); } else { intent.putExtra(“DATA”, “2”); ServerActivity.this.stopSelf(); } sendBroadcast(intent); }; }; @Override public void onCreate() { super.onCreate(); Thread thread = new Thread(new Runnable() { @Override public void run() { // 要做的事 try { for (int i = 0; i < 3; i++) {Thread.sleep(1000);Message message = new Message();message.what = i;handler.sendMessage(message); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); thread.start(); } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; }}AndroidManifest.xml
在做此实例时,遇到报错,一大串红字,最关键的一句话:
This message is already in use.
从网上查得:与handler发送Message相关,消息已经在消息队列了,而且正被使用,而如果往同一个队列发送相同的对象就会报错,电脑资料
造成这个错误是因为:final Message message = new Message(); Thread thread = new Thread(new Runnable() { @Override public void run() { // 要做的事 try { for (int i = 0; i < 3; i++) {Thread.sleep(1000);message.what = i;handler.sendMessage(message); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); thread.start();使用了同一个Message。用的API 19(4.4)与4.4模拟器,不显示错误,只是卡住,用的API 19(4.4)与2.2模拟器就报错了。
篇8:Android开发之Handler和Looper的关系
Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理,
Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。
MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行,
当然,存放Message并非实际意义的保存,而是将Message以链表的方式串联起来的,等待Looper的抽取。
Looper:消息泵,不断地从MessageQueue中抽取Message执行。因此,一个MessageQueue需要一个Looper。
Thread:线程,负责调度整个消息循环,即消息循环的执行场所。
如图所示,Handler负责将数据压栈到Message队尾中,并从队头取出数据,而Looper负责从队列中进行循环取出,得到Handler的数据。注意Looper必须是UI的Looper,我们才能对UI界面进行更新!
篇9:Android开发之自定义View开发及实例详解
在开发Android应用的过程中,难免需要自定义View,其实自定义View不难,只要了解原理,实现起来就没有那么难,
其主要原理就是继承View,重写构造方法、onDraw,(onMeasure)等函数。我自定义了个虚拟按键的View,
首先得自己写个自定义View类,这里我写了个VirtualKeyView类,继承自View类,实现了构造方法以及onDraw方法,以及实现了键盘按键的接口事件,实现代码如下:
复制代码
package com.czm.customview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
public class VirtualKeyView extends View{
private static final boolean bDebug = true;
private static final String TAG = VirtualKeyView.class.getSimpleName();
private Context mContext;
private Bitmap bmpRound;
private Bitmap bmpRound_press;
private Bitmap bmpOk;
private Bitmap bmpOk_press;
private int mWidth;//真实宽度
private int widthBg = 584;
//private int widthItemBg = 292;
private int widthMid = 220;//中心宽度
private int cir_Centre_X = 292;//圆心位置
private int cir_Centre_Y = 292;//圆心位置
private int bigRadius = 292;
private int smallRadius = 110;
private int smallCir_X = 182;
private int smallCir_Y = 182;
private float scale = 1.0f;
private boolean isInit = false;
private int inputPress = -1;//显示点击了哪个键
public VirtualKeyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
mContext = context;
}
public VirtualKeyView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
mContext = context;
}
private void initData() {
mWidth = getWidth();
scale = mWidth*1.0f/widthBg;
cir_Centre_X = (int) (cir_Centre_X*scale);
cir_Centre_Y = (int) (cir_Centre_Y*scale);
bigRadius = (int) (bigRadius*scale);
smallRadius = (int) (smallRadius*scale);
smallCir_X = (int) (smallCir_X*scale);
smallCir_Y = (int) (smallCir_Y*scale);
initView();
isInit = true;
}
private void initView() {
if(mWidth == widthBg){
bmpRound = Utils.decodeCustomRes(mContext, R.drawable.controller_round);
bmpRound_press= Utils.decodeCustomRes(mContext, R.drawable.controller_round_bg_pressed);
bmpOk= Utils.decodeCustomRes(mContext, R.drawable.controller_ok);
bmpOk_press= Utils.decodeCustomRes(mContext, R.drawable.controller_ok_pressed);
} else {
int mid = (int) (widthMid*scale);
Bitmap bitmapTmp = Utils.decodeCustomRes(mContext, R.drawable.controller_round);
bmpRound = Bitmap.createScaledBitmap(bitmapTmp, mWidth, mWidth, true);
bitmapTmp.recycle();
bitmapTmp = null;
bitmapTmp = Utils.decodeCustomRes(mContext, R.drawable.controller_round_bg_pressed);
bmpRound_press = Bitmap.createScaledBitmap(bitmapTmp, mWidth, mWidth, true);
bitmapTmp.recycle();
bitmapTmp = null;
bitmapTmp = Utils.decodeCustomRes(mContext, R.drawable.controller_ok);
文档为doc格式