Android-EditText、TextView、TabLayout基础使用

长期更新…

一、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)自定义密码字符

edittext自定义密码字符效果

[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

猜你喜欢

转载自blog.csdn.net/czssltt/article/details/123741474