在设置界面布局的时候,设计师会给一张标注了尺寸的UI设计图,如果在UI中包含了TextView空间的话,会发现即使完全按照标注的尺寸来做,最终的显示效果和设计图还是有差异。
设置字重号,比如这种
android:textFontWeight="400"
打开开发者模式中的布局边界,再观察APP的界面可以发现,在TextView中字体与TextView的边界是有一定的距离的,在720px的图中大概有2px的边界留白。就是这些默认的留白导致UI出现偏差。
在TextView提供的属性设置里面,有这样一条属性 android:includeFontPadding ,用来设置文本框是否包含顶部和底部留白(左右两侧默认没有留白),将其设置为false,TextView就会取消2px的留白。避免TextView导致UI出现差异
android:includeFontPadding="false" 清除TextView字体周边空白
Edittext光标放到最后
et.setText(content);//设置EditText控件的内容
et.setSelection(content.length());//将光标移至文字末尾
如何让EditText不自动获取焦点
在项目中,一进入一个页面, EditText默认就会自动获取焦点。
那么如何取消这个默认行为呢?
在网上找了好久,有点 监听软键盘事件,有点 调用 clearFouse()方法,但是测试了都没有! xml中也找不到相应的属性可以关闭这个默认行
解决之道:在EditText的父级控件中找一个,设置成
android:focusable="true" android:focusableInTouchMode="true"这样,就把EditText默认的行为截断了!
Andr设置控件的透明度
android:alpha="0.5"
EditText searchView = (EditText) findViewById(R.id.search_text);
searchView.setOnFocusChangeListener(new android.view.View.
OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
// 此处为得到焦点时的处理内容
} else {
// 此处为失去焦点时的处理内容
}
}
});
设置EditText自动获取焦点并弹出输入法
// 获取编辑框焦点
editText.setFocusable(true);
//打开软键盘
InputMethodManager imm = (InputMethodManager)MainActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
//关闭软键盘
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
Android系统中TextView默认行间距比较窄,不美观。
我们可以设置每行的行间距,可以通过属性android:lineSpacingExtra或android:lineSpacingMultiplier来做。
在你要设置的TextView中加入如下代码:
1、android:lineSpacingExtra
设置行间距,如”8dp”。
2、android:lineSpacingMultiplier
设置行间距的倍数,如”1.5″。
通过获取控件上面的数字,进行拨打电话
phone_text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_DIAL);
Uri data = Uri.parse("tel:" + phone_text.getText());
intent.setData(data);
startActivity(intent);
}
});
实现textview最后一行只显示一半的效果
不知道大家有没有接到过这种需求,textview要求最大3行,并且最后一行只显示一半,以省略号结尾
一开始觉得很蛋疼,一直没有好的思路,后来想到一种方案,就是用textview的paint可以计算出整个String的需要的宽度stringWidth,并且能计算出textview tvWidth的宽度
就可以推导出一个公式
line = stringWidth / tvWidth
这个line就是textview需要的行数
如果行数超过我们预期的行数,我们可以对String取子串
public static String getSubString(TextView tv, String content, int maxLine){
float width = tv.getPaint().measureText(content);
//这里只是为了方便,用屏幕宽度代替了textview控件宽度,如果需要精准控制,可以换成控件宽度
float tvWidth = activity.getWindowManager().getDefaultDisplay().getWidth();
if(width / tvWidth > (maxLine + 0.5)){
return content.substring(0,(int)(content.length()/(width/tvWidth)/(maxLine + 0.5))) + "...";
}
return content;
}
如果你想要显示2.5行 就可以传入maxLine=2
如果想显示2.3行,就把方法里的0.5改成0.3
要控制EditText单行显示需要同时设置
android:singleLine="true"
和android:maxLines="1";
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- 矩形的圆角弧度 -->
<corners android:radius="8dp" />
<!-- 矩形的填充色 -->
<solid android:color="@color/black" />
<!--<stroke-->
<!--android:width="0.5dp"-->
<!--android:color="#4eb621" />-->
</shape>
EditText 修改光标颜色和宽度
1.在资源文件drawable下新建一个光标控制color_cursor.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<size android:width="1dp" />
<solid android:color="#008000" />
</shape>
2.设置EditText:android:textCursorDrawable=”@drawable/color_cursor”
TextView设置下划线、删除线
private TextView textView;
textView.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);//下划线
textView.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);//删除线
textView.getPaint().setAntiAlias(true);//抗锯齿
TextView 实现复制文本功能
Android api 11 以后可以直接设置 android:textIsSelectable="true"
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="16sp"
android:text="Hello World"
android:gravity="center"
android:textIsSelectable="true"
/>
设置EditText只能输入小数点后两位,在价格等有限制的输入时特别有效
//设置EditText只能输入小数点后两位,在价格等有限制的输入时特别有效
private void setTextChanged(EditText editText) {
editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.toString().contains(".")) {
if (s.length() - 1 - s.toString().indexOf(".") > 2) {
s = s.toString().subSequence(0, s.toString().indexOf(".") + 3);
editText.setText(s);
editText.setSelection(s.length());
}
}
if (s.toString().trim().substring(0).equals(".")) {
s = "0" + s;
editText.setText(s);
editText.setSelection(2);
}
if (s.toString().startsWith("0") && s.toString().trim().length() > 1) {
if (!s.toString().substring(1, 2).equals(".")) {
editText.setText(s.subSequence(0, 1));
editText.setSelection(1);
return;
}
}
data_result.setText("");
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
}