开写前的一些话语
本人从事Android开发,约莫有一年时间,关于这两个TextView和EditText,这两个常用控件,在大学期间,只有少量的接触,起初觉得还挺简单的,后来在开发中遇到相应的问题,才觉得这两个常用的东西,还是有很多门道的,特此写一小份帖子,供给他人取用。
1.TextView
关于这个控件,我分享一些它的相关属性使用,方便大家在自己的项目开发中使用。
1.1增加显示效果
1.1.1TextView.setStrikeThruText(boolean strikeThruText) 这个方法,代表是否加删除线
1.1.2TextView.setUnderlineText(boolean underlineText) 这个方法,代表是否设置下划线
1.1.3TextView.setFakeBoldText(boolean fakeBoldText) 这个方法,代表是否设置粗体
1.1.4.TextView.getPaint().setAntiAlias(boolean antiAlias); 这个方法,代表是否开启抗锯齿效果
1.2增加图形设置
布局中,通过drawableLeft,drawableRight,drawableTop,drawableBottom属性,在文字的上下左右,设置对应的图片
代码中,可以通过TextView..setCompoundDrawables(null, null, null, null)来设置
值得注意的是,方法内设置为null,即取消对应方位的图片,一行代码足矣
若是要在代码中,主动设置图片,则需要加一行:
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
如此做,应该是为了设置放置图片的宽高,否则的话,高0,宽0的图片设置进来,便没有效果
完整代码如下:
Drawable drawable=ContextCompat.getDrawable(R.drawable.icon); //比getResources方法,更加通用
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
TextView.setCompoundDrawables(null, null, drawable, null);
1.3代码中设置TextView的长度与内容
举例:
如以下代码,number代表区号,mobile代表手机号,因区号和手机号的长度不定,且是从上一个页面传过来的,为了在这个页面显示,突出其颜色值,可以按照以下代码操作,利用首尾文字是固定的特点,利用SpannableStringBuilder与ForegroundColorSpan,去设置截取中间一段,有关于带区号手机号码的数字:
String s = "我们已经给手机号码" + number + " " + mobile + "发送了一个4位数的验证码";
TextView.setText(s);
SpannableStringBuilder builder = new SpannableStringBuilder(TextView.getText().toString());
ForegroundColorSpan span = new ForegroundColorSpan(Color.rgb(255, 102, 0));
builder.setSpan(span, 9, s.length() - 12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
TextView.setText(builder);
1.4TextView与定时器的结合
举例:
private int nTimer = 0;
private Timer timer = null;
TimerTask timeTask = null;
private void startTimeCountdown() {
nTimer = 60;
updateCountdownButtonUI();
timer = new Timer();
timeTask = new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(1);
}
};
timer.schedule(timeTask, 1000, 1000);
}
private void stopTimeCountdown() {
if (timeTask != null) {
timeTask.cancel();
timeTask = null;
}
if (timer != null) {
timer.cancel();
timer = null;
}
nTimer = 0;
updateCountdownButtonUI();
}
Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) {
nTimer--;
if (nTimer == 0) {
stopTimeCountdown();
} else
updateCountdownButtonUI();
}
super.handleMessage(msg);
}
};
private void updateCountdownButtonUI() {
if (nTimer > 0) {
TextView.setText("重新发送(" + String.format("%d", nTimer) + ")");
TextView.setTextColor(Color.rgb(189, 189, 189));
TextView.setEnabled(false);
} else {
TextView.setText("重新发送"); //.setText()是设置TextView内容的方法
TextView.setTextColor(Color.rgb(255, 102, 0)); //.setTextColor()是设置TextView颜色的方法
TextView.setEnabled(true); //setEnabled()是设置TextView是否可以响应触摸事件
}
}
以上代码,从进入这个页面后,在protected void onCreate(Bundle savedInstanceState){},便调用startTimeCountdown();方法,即可将TextView置为不可点击,且初始60秒,会在定时器的作用下,开始倒数,每隔一秒钟,数字减1,直到mTime不在大于零,便改变TextView的文字、颜色,以及让其可点击。
而在再度点击完按钮后,除了请求接口发送短信以外,在调用startTimeCountdown();方法,便可以实现循环。
如此一来,一个限时一分钟,才能发送一次的短信验证码TextView,就实现了。
注:setEnabled() 和 setClickable():
这两个方法是有区别的
前者,setEnabled()设置为false,包括触摸事件,都不会被响应
后者,setClickable()设置为false,还可以响应触摸事件,且在源码中,若是调用setOnclickListener()方法,会自动把setClickable()从false置为true
2.EditText
2.1关于EditText的一些基础设置
2.1.1下划线的设置
在布局中,可以设置android:background="@null",这是代表去掉下划线的
若是你想要设置不同颜色的下划线,改变这个参数的设置即可。
2.1.2设置光标颜色
可以在布局中,设置这个参数android:textCursorDrawable
2.1.3获取焦点
EditText.setFocusable(true);
EditText.setFocusableInTouchMode(true);
EditText.requestFocus();
2.2inputtype属性
指代的是,edittext控件,可输入的类型,种类有很多,下面列举最常用的几种:
android:inputType="text"//输入类型为普通文本
android:inputType="number"//输入类型为数字文本
android:inputType=”phone”//输入类型为电话号码
android:inputType="textPassword"//输入一个密码
注:代码中也可设置
配合checkbox等控件,可以实现类似于密码的显示与隐藏效果,代码如下:
public void onHideOrShow() {
if (hide_or_show.isChecked()) {
et_password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
et_password.setSelection(et_password.getText().length());
} else {
et_password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
et_password.setSelection(et_password.getText().length()); //可让在点击切换的过程中,光标一直处于末尾处
}
}
效果如下图:
2.3禁用复制粘贴功能
Android SDK 23 即6.0以前,想要禁用EditText的复制粘贴功能,只需:EditText.setLongClickable(false);禁用其长按点击事件即可
Android SDK 23 即6.0以后,光是禁用EditText的长按点击事件,还不够:
还需:
et.setCustomInsertionActionModeCallback(new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
});
注:因为这个方法,是6.0以后才出现的,为了避免报java.lang.NoSuchMethodError:的错误,考虑到兼容性,使用这个监控方法前,最好是做一个判断,即:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
……
}
2.4输入长度的限制
若是想要限制EditText所能够输入的长度,可以在代码或布局中设置相关属性,即:
布局中,设置android:maxLength=""
代码中,设置editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(???)});
完了么?
并没有。
上述方法,在大多数情况下,已经可以适用了。
可若是遇上可以输入中文的地方,且还需要限制,比如说,设置昵称时,以上方法,就不够用了。
因为,在计算机底层语言中,一个汉字是等于两个字符的,但,实际情况,在edittext的输入过程中,汉字与字母、数字的比例,仍是一比一比一
为了匹配一些要求,比如说昵称输入,可以监控.addTextChangedListener方法,如下代码所示:
举例:
final Pattern pa = Pattern.compile("^[\\u4e00-\\u9fa5]*$"); //匹配汉字的正则表达式
et_nick.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String temp = et_nick.getText().toString();
char[] textChar = temp.toCharArray();
int num = 0;
for (int i = 0; i < temp.length(); i++) {
if ((pa.matcher(textChar[i] + "")).find()) {
num += 2;
} else {
num += 1;
}
if (num >= 17) {
if (num == 18 || num == 17) {
et_nick.setText(temp.substring(0, i));
Toast.makeText(mContext, "昵称最多输入8个汉字或16个字符", Toast.LENGTH_SHORT).show();
} else {
//Log.e("TAG",num+"----------------------");
}
break;
}
}
et_nick.setSelection(et_nick.getText().length());
}
});
2.5软键盘的调取和关闭
在一些页面,需要在一进来时,便获取EditText的焦点,并弹出软键盘,要实现这个效果,需要在AndroidManifest.xml做相关的配置,即:
关键代码,应该是最后一行代码。
至于,在代码中跳转到下一个页面,手动关闭软键盘的代码,如下:
//如果显示输入框就关闭
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
}
2.6关于EditText最后的一些补充
2.6.1
EditText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) {
return true;
}
return false;
}
});
此方法,可监控软键盘是否按下、删除,可在其中做一些操作,返回true表示相应,返回false表示不响应
2.6.2
有些时候,对于edittext的输入,会做一定的要求,比如说必须数字,必须字母,必须大写之内的,下面提供一个,必须包含两种不同字符,即数字、字母,特殊字符,至少有其二的一个方法:
public static boolean isContain(String str) {
boolean isDigit = false;//定义一个boolean值,用来表示是否包含数字
boolean isLetter = false;//定义一个boolean值,用来表示是否包含字母
boolean isOther = false;//定义一个boolean值,用来表示是否包含字符
for (int i = 0; i < str.length(); i++) {
if (Character.isDigit(str.charAt(i))) { //用char包装类中的判断数字的方法判断每一个字符
isDigit = true;
} else if (Character.isLetter(str.charAt(i))) { //用char包装类中的判断字母的方法判断每一个字符
isLetter = true;
} else {
isOther = true;
}
}
boolean isRight = (isDigit && isLetter) || (isDigit && isOther) || (isLetter && isOther);
return isRight;
}
总结
在参加工作的这一年里,我感觉自己学到了很多,从一开始的懵懵懂懂,到现在,是越来越自信了。
而关于我以上所述的,其实通过百度、google,都是可以找到的,在技术这一路上,不管是Android,还是其他语言,需要的是独立自主解决问题的能力,学会学习,你才能在这条路上走得更远,最后,祝你我都能成为更好的Android开发人员。