长期更新…
一、EditText
1. 常用属性
<EditText android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:background = "背景" @null透明
android:hint = "提示文本"
android:textColorHint = "提示文本颜色"
android:textColorHighlight = "被选中的字体颜色"
android:textCursorDrawable = "被光标的颜色"
android:textStyle = "字体样式" bold(加粗), italic(倾斜), normal(默认)
android:typeface = "文本字体" monospace (等宽) , sans, serif, normal(默认)
android:inputType = "输入类型"
android:digits = "只接受的指定内容" 身份证:0123456789X
android:maxLength = "文本最多个数"
android:lines = "显示行数"
android:minLines = "最小行数" 固定了宽的最小值
android:maxLines = "最大行数" 超出滚动条
android:lineSpacingExtra = "行间距"
android:lineSpacingMultiplier = "行间距倍数"
android:imeOptions = "键盘右下角动作" actionDone (完成) actionSend (发送) actionSearch (搜索)
android:selectAllOnFocus="是否获得焦点全选" />
1)inputType 输入类型/键盘行为
输入类型:
textEmailAddress(带@), textUrl(带/),number(数字), phone(电话), datetime时间日期
键盘行为:
textCapSentences (大写每个新句子的第一个字母)
textCapWords (大写每个单词)
textAutoCorrect (正常文本键盘,可纠正拼写错误的字词)
textPassword (密文显示)
2)imeOptions指定键盘右下角回车键位置:
(在使用imeOptions时,如果你没有使用inputType属性,是不会有效果的)
3)设置光标
[1] 控制光标属性 android:textCursorDrawable
设置EditView的光标颜色和text color一样:android:textCursorDrawable=“@null”
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<size android:width="2dp" />
<solid android:color="@color/color1" />
</shape>
[2] 动态设置光标颜色:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, new int[]{
ColorUtil.COLOR_CHECKED,ColorUtil.COLOR_CHECKED});
gd.setSize(UIUtil.dip2px(mContext,1.5),UIUtil.dip2px(mContext,etSearch.getTextCursorDrawable().getIntrinsicHeight()));
etSearch.setTextCursorDrawable(gd);
}
2. 监听事件
1)监听输入框内容
需求:只能输入有限位小数,且限制最大值
etNum.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String num = etNum.getText().toString().trim();
if(TextUtils.isEmpty(num)){
return;}
//删除.后面超过2位的数字(最多可输入2位小数)
if (num.contains(".")) {
if (s.length() - 1 - s.toString().indexOf(".") > 2) {
s = s.toString().subSequence(0,s.toString().indexOf(".") + 3);
etNum.setText(s);
etNum.setSelection(s.length());
}
}
//如果.在起始位置,则起始位置自动补0
if (num.substring(0).equals(".")) {
s = "0" + s;
etNum.setText(s);
etNum.setSelection(2);
}
//如果起始位置为0并且第二位跟的不是".",则无法后续输入
if (num.startsWith("0") && s.toString().trim().length() > 1) {
if (!s.toString().substring(1, 2).equals(".")) {
etNum.setText(s.subSequence(0, 1));
etNum.setSelection(1);
return;
}
}
//如果大于可用数量的数就设最大
if (!num.substring(0).equals(".") && Double.parseDouble(num) > sumNum ){
etNum.setText(sumNum+"");
return;
}
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
});
EditText 金额限制:输入 . 追加0 、00开头替换为0 、0开头并且第二位不是.的情况下去除开头的0
(来源:https://blog.csdn.net/xiaoerbuyu1233/article/details/125083072)
android:inputType="numberDecimal"
etNum.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String text = s.toString();
if (TextUtils.isEmpty(text)) {
return;
}
if (text.startsWith("00")) {
edt.setText(text.replace("00", "0"));//去除00开头
}
if (text.startsWith("0") && text.length() >= 2 && !".".equals(text.charAt(1) + "")) {
edt.setText(text.substring(1));//替换整数0开头 输入01显示1
}
if (text.startsWith(".")) {
edt.setText(String.format("0%s", text));//.开头替换为0.开头
}
if (text.contains(".") && (text.length() - text.indexOf(".")) > 3) {
edt.setText(text.substring(0, text.length() - 1));//保留两位小数
}
if (text.length() > 7) {
edt.setText(text.substring(0, text.length() - 1));//长度7位
}
edt.setSelection(edt.getText().length());//不能用 text.length() 否则输入00索引异常
}
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
});
2)监听回车键
需求:搜索框输入内容时,键盘的回车键应该是搜索,并且按下回车键去请求接口
步骤1:添加属性(ps:两个都必须加,singleLine不能用maxLine替代,否则小米手机无效
android:singleLine="true"
android:imeOptions="actionSearch"
- Android:imeOptions 有多种属性,对应Enter键文字:
actionDone - 完成
actionSend - 发送
actionSearch - 搜索
步骤2:监听回车键(监听Enter键来屏蔽Enter键的换行操作)
et_phone_1.setOnEditorActionListener((v, actionId, event) -> {
//actionId 对应 imeOptions属性值
if(actionId == EditorInfo.IME_ACTION_SEARCH){
String phone = et_phone_1.getText().toString().trim();
//请求接口...收起软键盘...
}
return false;
});
3)监听获取/失去焦点
etInput.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
// 得到焦点
} else {
// 失去焦点
}
}
});
//文本框重新获取焦点
setFocusable(true);
setFocusableInTouchMode(true);
requestFocus();
findFocus();
//失去焦点
clearFocus();
setFocusable(false);
//获取文本框焦点状态
hasFocus();
3.相关
1) 弹出/收起软键盘
InputMethodManager manager = ((InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE));
if (manager != null){
// 弹出键盘
manager.showSoftInput(view, 0);
// 收起键盘
manager.hideSoftInputFromWindow(view.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
}
2) 获取光标位置
//将光标移至文字末尾
et.setSelection(content.length());
//在光标处插入字符
int index = editText.getSelectionStart();//获取光标位置
Editable editable = editText.getText();
editable.insert(index, "aaaa");
//删除光标前字符
int index = editText.getSelectionStart();
Editable editable = editText.getText();
editable.delete(index-1, index);
3) 一进页面就要立刻弹出键盘
//可能会由于界面未加载完成而无法弹出,需要适当延迟
viewDataBinding.etSearch.requestFocus();
viewDataBinding.etSearch.setFocusableInTouchMode(true);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
InputMethodManager inputManager =(InputMethodManager)viewDataBinding.etSearch.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(viewDataBinding.etSearch, 0);
}
}, 500);
4)自定义密码字符
[1] 加入控件
<EditText
android:id="@+id/et_pass"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入密码"
android:maxLines="1"
android:inputType="textPassword"
android:background="@null"/>
[2] 创建密码样式方法类
public class EditTextBigCircle extends PasswordTransformationMethod {
//密码样式方法类
@Override
public CharSequence getTransformation(CharSequence source, View view) {
return new PasswordCharSequence(source);
}
private class PasswordCharSequence implements CharSequence {
//自定义CharSequence字符序列
private CharSequence mSource;
public PasswordCharSequence(CharSequence source) {
mSource = source;
}
public char charAt(int index) {
return '●'; // 字符样式
}
public int length() {
return mSource.length();
}
public CharSequence subSequence(int start, int end) {
return mSource.subSequence(start, end);
}
}
}
[3] 为控件设置样式
et_pass.setTransformationMethod(new EditTextBigCircle());
二、TextView
1.属性
<TextView
android:id="@id/navigation_bar_item_small_label_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:duplicateParentState="true"
android:textSize="14sp"
android:ellipsize="end" 超长省略号位置 start end middle
android:maxLines="1"
android:enabled="true"
android:textIsSelectable="true" 可点按选择
android:focusable="true"
android:longClickable="true" 长按复制
/>
1. 多颜色字体及点击事件监听:
https://www.freesion.com/article/27551098036/
方式一:用标签
holder.setText(R.id.tv_content, Html.fromHtml("<font color='#0000ff'>...展开</font>" ));
方式二:SpannableString 对象,传参就是要显示的文本,然后通过 setSpan 方法设置文本风格,最后设置 Textview。
SpannableString spanStr = new SpannableString("xxx");
spanStr.setSpan(new ForegroundColorSpan(Color.parseColor("#FF0000")), 2, spanStr.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv5.setText(spanStr);
//监听点击事件
SpannableString spannableString=new SpannableString(tips);
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "onClick:10086", Toast.LENGTH_SHORT).show();
}
}, tips.length() - 5, tips.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv_spannable.setText(tips);
tv_spannable.setMovementMethod(LinkMovementMethod.getInstance());//设置可点击状态
2. 代码设置…
drawableRight:
Drawable drawable = getResources().getDrawable(R.mipmap.icon_list_hot);
drawable.setBounds(0, 0, drawable.getMinimumWidth(),drawable.getMinimumHeight());
((TextView)baseViewHolder.getView(R.id.tv_title)).setCompoundDrawables(null, null, null, drawable);
修改shape颜色:
View viewFront = viewHolder.itemView.findViewById(R.id.view_front);
GradientDrawable mGradientDrawable = (GradientDrawable)viewFront.getBackground();
mGradientDrawable.setColor(getResources().getColor(frontColorIds[position%5]));
设置字体:
String familyName = "宋体";
Typeface font = Typeface.create(familyName,Typeface.BOLD);
p.setTypeface(font);
//外部字体
//从assert中获取有资源,assert/下面的相对路径。在实际使用中,字体库可能存在于SD卡上,可以采用createFromFile()来替代createFromAsset。
Typeface face = Typeface.createFromAsset(getAssets(), "fonts/HanYi.ttf");
//title是之间定义的控件
title.setTypeface(face);
首行缩进:
方式一:setText(“\u3000\u3000”+xxxxx)
方式二:隐藏掉原文的头两个字符,达到缩进的错觉
SpannableStringBuilder span = new SpannableStringBuilder("缩进"+textReason.getText());
span.setSpan(new ForegroundColorSpan(Color.TRANSPARENT), 0, 2, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
tvTest.setText(span);
3. 添加下划线
方式一:android:autoLink=“all” (会主动调用系统浏览器,跳转链接)
方式二:Paint的属性
tvTest.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG); //下划线
tvTest.getPaint().setAntiAlias(true);//抗锯齿
方式三:富文本
SpannableString content = new SpannableString(str);
content.setSpan(new UnderLineSpan, 0, str.length(), 0);
方式四:Html.fromHtml()
tvTest.setText(Html.fromHtml("<u>"+"0123456"+"</u>"));
4. TextView/EditText显示GIF图片富文本
https://blog.csdn.net/u011956004/article/details/103900347
三、TabLayout
1. 简单使用
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
app:tabSelectedTextColor="@color/red_dc3c23"
app:tabTextColor="@color/text_white"
app:tabIndicatorHeight="3dp"
app:tabIndicator="@drawable/tab_indicator" 自定义指示器
app:tabIndicatorColor="@color/red_dc3c23"
app:tabTextAppearance="@style/TabLayoutTextNormalStyle" style
app:tabRippleColor="@android:color/transparent" 去除点击水波纹
app:tabPaddingEnd="0dp"
app:tabPaddingStart="0dp" 处理字体大小不同/>
//style
<style name="MyCustomTextAppearance" parent="TextAppearance.Design.Tab">
<item name="textAllCaps">true</item>
<item name="android:textAllCaps">true</item>
<item name="android:textSize">14sp</item>
</style>
//tab_indicator.xml 自定义指示器
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<item android:gravity="center">
<shape>
<size android:height="3dp" android:width="70dp"/>
<corners android:topLeftRadius="1.5dp" android:topRightRadius="1.5dp"/>
</shape>
</item>
</layer-list>
2. 选中字体加粗,未选中字体不加粗:(小bug:左右滑动指示器位置会闪一下)
viewDataBinding.tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
if (tab == null || tab.getText() == null) {
return;}
String trim = tab.getText().toString().trim();
SpannableString spStr = new SpannableString(trim);
StyleSpan styleSpan_B = new StyleSpan(Typeface.BOLD);
spStr.setSpan(styleSpan_B, 0, trim.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
tab.setText(spStr);
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
if (tab == null || tab.getText() == null) {
return;
}
}
3. TabLayout text不要默认大写
<style name="TabLayoutTextStyle" parent="TextAppearance.Design.Tab">
<item name="textAllCaps">false</item>
<item name="android:textAllCaps">false</item>
</style>
四、RecyclerView
1. 取消rv阴影:rvAllRank.setOverScrollMode(View.OVER_SCROLL_NEVER);
2. RecyclerView数据不显示的原因
1)没有设置setLayoutManager导致RecyclerView不知道以怎么样的方式布局。
mListView.setLayoutManager(new LinearLayoutManager(this));
2)没有重写adapter的getItemCount,默认是0
参考链接:
监听回车键:https://blog.csdn.net/weixin_42814000/article/details/107327962