@TOC
【27.EditText软键盘】
EditText初始不弹出软键盘,只有光标显示,点击再弹出
解决方法1:
在清单activity属性中设置
android:windowSoftInputMode="stateHidden"
解决方法2:
InputMethodManager inputMethodManager = (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(et.getWindowToken(), 0);
解决方法3:
系统默认第一个EditText是获得焦点的,解决办法,增加一个不显示的view强制获得焦点,比如
<View
android:layout_width="0dip"
android:layout_height="0dip"
android:focusableInTouchMode="true" />
【隐藏软键盘-未验证】
// * 隐藏软件盘
public void hideSoftInput() {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
if (getCurrentFocus() != null) {
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
// * 点击软键盘之外的空白处,隐藏软件盘
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (ToolUtil.isShouldHideInput(v, ev)) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
return super.dispatchTouchEvent(ev);
}
// 必不可少,否则所有的组件都不会有TouchEvent了
if (getWindow().superDispatchTouchEvent(ev)) {
return true;
}
return onTouchEvent(ev);
}
// * 显示软键盘
public void showInputMethod(){
if (getCurrentFocus() != null){
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
imm.showSoftInputFromInputMethod(getCurrentFocus().getWindowToken(),0);
}
}
【软键盘不遮挡输入框】
https://blog.csdn.net/u012523122/article/details/52101303/
方法一:在你的activity中的oncreate中setContentView之前写上这个代码
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
方法二:在项目的AndroidManifest.xml文件中界面对应的里加入
android:windowSoftInputMode="stateVisible|adjustResize"
这样会让屏幕整体上移。
如果加上的 是 android:windowSoftInputMode="adjustPan"这样键盘就会覆盖屏幕。
各值的含义:
stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
stateHidden:用户选择activity时,软键盘总是被隐藏
stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
stateVisible:软键盘通常是可见的
stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
方法三:(用的此处)
把顶级的layout替换成ScrollView,或者说在顶级的Layout上面再加一层ScrollView。
这样就会把软键盘和输入框一起滚动了,软键盘会一直处于底部。
一般顶级View需要加上 android:fitsSystemWindows="true"
【28.定时器】(注意不是延时器)
1.Handler类的postDelayed方法:
Handler mHandler = new Handler();
Runnable r = new Runnable() {
@Override
public void run() {
//do something
//每隔1s循环执行run方法
mHandler.postDelayed(this, 1000);
}
};
主线程中调用: mHandler.postDelayed(r, 100);//延时100毫秒
2.用handler+timer+timeTask方法:
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1){
//do something
}
super.handleMessage(msg);
}
};
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
主线程中调用:timer.schedule(timerTask,1000,500);//延时1s,每隔500毫秒执行一次run方法
3.Thread+handler方法:
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1){
//do something
}
super.handleMessage(msg);
}
};
class MyThread extends Thread {//这里也可用Runnable接口实现
@Override
public void run() {
while (true){
try {
Thread.sleep(1000);//每隔1s执行一次
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
主线程中调用:new Thread(new MyThread()).start();
【29.延时器】
1.Handler的postDelayed方法:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//do something
}
}, 1000); //延时1s执行
2.timer + TimerTask方法:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
//do something
}
},1000);//延时1s执行
3.Thread方法:
new Thread(new MyThread()).start();
//或
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);//延时1s
//do something
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
【30.TextView 上下滑动 左右滑动设置】
1.垂直滑动
android:scrollbars = "vertical"
2.水平滑动
android:scrollbars = "horizontal"
android:scrollbars="none" //不显示滚动条
必须在Java添加(否则无法滑动)
ArrowKeyMovementMethod.getInstance() //水平
tx.setMovementMethod(ScrollingMovementMethod.getInstance()); /垂直
要加:android:ellipsize="none"
android:singleLine="true"
3.设置滚动条一直存在
android:fadeScrollbars="false"
4.自定义滚动条属性
android:scrollbarThumbVertical="@drawable/bar"
5.跑马灯:
android:singleLine="true"
android:ellipsize="marquee"
https://blog.csdn.net/beiminglei/article/details/9317997
//设置字符宽度(其实em是一个印刷排版的单位,表示字宽的单位)为10,
//一般一个汉字为一个宽度,
android:maxEms="10"
//值为1-5时,m = n..
6-11时,m = n+1。
12-18时,m = n+2。
【31.防止快速点击】
private static long lastClick = 0;
private boolean fastClick() {
if (System.currentTimeMillis() - lastClick <= 1000) {
return false;
}
lastClick = System.currentTimeMillis();
return true;
}
【32.EditText 输入内容】
代码中
//InputType.TYPE_NUMBER_FLAG_DECIMAL 的代码是8192,而我们需要的是8194就是android:inputType="numberDecimal",
//但是没有这个常量,所以我们需要手动的输入数字
editText.setInputType(8194);
android:digits="1234567890." ==== editText.setInputType(EditorInfo.TYPE_CLASS_PHONE);
InputType.TYPE_CLASS_NUMBER 数字类型 1234567890
InputType.TYPE_CLASS_DATETIME 日期类型 1234567890/-
//自定义digits(https://www.jianshu.com/p/691b00e750c7)
editText.setKeyListener(DigitsKeyListener.getInstance("0123456789-"));
android:inputType="none"--输入普通字符
android:inputType="text"--输入普通字符
android:inputType="textCapCharacters"--输入普通字符
android:inputType="textCapWords"--单词首字母大小
android:inputType="textCapSentences"--仅第一个字母大小
android:inputType="textAutoCorrect"--前两个自动完成
android:inputType="textAutoComplete"--前两个自动完成
android:inputType="textMultiLine"--多行输入
android:inputType="textImeMultiLine"--输入法多行(不一定支持)
android:inputType="textNoSuggestions"--不提示
android:inputType="textUri"--URI格式
android:inputType="textEmailAddress"--电子邮件地址格式
android:inputType="textEmailSubject"--邮件主题格式
android:inputType="textShortMessage"--短消息格式
android:inputType="textLongMessage"--长消息格式
android:inputType="textPersonName"--人名格式
android:inputType="textPostalAddress"--邮政格式
android:inputType="textPassword"--密码格式
android:inputType="textVisiblePassword"--密码可见格式
android:inputType="textWebEditText"--作为网页表单的文本格式
android:inputType="textFilter"--文本筛选格式
android:inputType="textPhonetic"--拼音输入格式
android:inputType="number"--数字格式
android:inputType="numberSigned"--有符号数字格式
android:inputType="numberDecimal"--可以带小数点的浮点格式
android:inputType="phone"--拨号键盘
android:inputType="datetime"
android:inputType="date"--日期键盘
android:inputType="time"--时间键盘
EditText有默认高度直接设置setHeight没作用。
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
DensityUtil.dip2px(context, 25));
layoutParams.setMargins(0, 0, 0, 0);
editText.setIncludeFontPadding(false);//去除内边距
//最大输入长度
editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(10)}); //最大输入长度
【kotlin版:editText.filters = arrayOf(InputFilter.LengthFilter(24))】
editText.setInputType(InputType.TYPE_CLASS_NUMBER); //数字输入类型
editText.setTextColor(context.getResources().getColor(R.color.color_888888));
editText.setPadding(10, 0, 0, 1);//否则文字显示不全
editText.setLayoutParams(layoutParams);//这有这样才能设置宽高,否则默认高度80(有内边距)/75
editText.setBackground(null); //去除下划线及所有格式
样式:
android:background="@null"//光标的样式没有改变,下划线消失了,边距也没有了
游标样式
<EditText
android:text=" "//初始游标向后移动一个单位
android:textCursorDrawable="@drawable/color_cursor"//设置游标宽度和颜色
将textCursorDrawable设置为@null,表示去除系统默认的样式
隐藏光标的属性是android:cursorVisible,光标的颜色是跟文字android:textColor保持一致
sendText.setSelection(sendText.getText().length()); //游标在最后
sendText.setSelection(0, sendText.getText().length()); //选中全部内容
下划线修改样式:[https://www.jb51.net/article/121010.htm]()
//用的此
<style name="MyEditText" parent="Theme.AppCompat.Light">
<item name="colorControlNormal">@color/indigo</item> //控件默认的颜色
<item name="colorControlActivated">@color/pink</item>//控件被激活时的颜色
</style>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Hint text"
android:theme="@style/MyEditText"/>
//其他
et_underline_unselected.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="0dp"
android:left="-2dp"
android:right="-2dp"
android:top="-2dp">
<shape>
<solid android:color="@android:color/transparent" />
<stroke
android:width="1dp"
android:color="@android:color/darker_gray" />
<padding android:bottom="4dp" />
</shape>
</item>
</layer-list>
et_underline_selected.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:bottom="0dp"
android:left="-2dp"
android:right="-2dp"
android:top="-2dp">
<shape>
<solid android:color="@android:color/transparent" />
<stroke
android:color="@android:color/holo_green_light"
android:width="2dp" />
<padding android:bottom="4dp" />
</shape>
</item>
</layer-list>
//第一种:
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:background="@null"
android:hint="自定义EditText下划线1"
android:textCursorDrawable="@drawable/cursor_color" />
/**初始化EditText,默认都为未选中状态**/
editText1.setBackgroundResource(R.drawable.et_underline_unselected);
/**第一个EditText的焦点监听事件**/
editText1.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
Log.e(TAG, "EditText1获得焦点");
editText1.setBackgroundResource(R.drawable.et_underline_selected);
} else {
Log.e(TAG, "EditText1失去焦点");
editText1.setBackgroundResource(R.drawable.et_underline_unselected);
}
}
});
//第二种
et_underline_selector.xml
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="false" android:drawable="@drawable/et_underline_unselected"/>
<item android:state_focused="true" android:drawable="@drawable/et_underline_selected"/>
</selector>
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:background="@drawable/et_underline_selector"
android:hint="自定义EditText下划线1"
android:textCursorDrawable="@drawable/cursor_color" />
cursor_color.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size android:width="2dp" />
<solid android:color="@android:color/holo_blue_light" />
</shape>
【33.AndroidBase64加解密】
Android项目引用不到以下两个java类
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
Android有自己的base64类
import android.util.Base64
String str = "Hello!";
//base64编码
//String strBase64 = new String(Base64.encode(str.getBytes(), Base64.DEFAULT));
String strBase64 = Base64.encodeToString(str.getBytes(), Base64.DEFAULT);
//base64解码
String str2 = new String(Base64.decode(strBase64.getBytes(), Base64.DEFAULT));
【34.Java中字符串拼接-删除最后一个字符】
str.split("\|"); //转义字符
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 5; i++) {
builder.append("aaa").append(",");
}
System.out.println(builder.toString());
if (builder.length() <= 0) {
return;
}
//或者 String 用equals ===与上面length判段一样
if ("".contentEquals(time)) {
return;
}
String aaa = builder.substring(0, builder.length() - 1);
System.out.println(aaa);
//1.deleteCharAt
builder = builder.deleteCharAt(builder.length() - 1);
System.out.println(builder.toString());
//2.【用的这个】如果没有,则返回-1
builder = builder.deleteCharAt(builder.lastIndexOf(","));
System.out.println(builder);
//3.setLength
builder.setLength(builder.length() - 1);
System.out.println(builder);
//Java8的内置一个新的StringJoiner
StringJoiner joiner = new StringJoiner(",");
for (int i = 0; i < 5; i++) {
joiner.add("bbb");
}
System.out.println(joiner);
//其他-在前面添加分隔符,然后删除
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5; i++) {
sb.append(",").append(i);
}
sb = sb.deleteCharAt(0);
System.out.println(sb);
//输出
原始:aaa,aaa,aaa,aaa,aaa,
substring:aaa,aaa,aaa,aaa,aaa
deleteCharAt + length:aaa,aaa,aaa,aaa,aaa //注意
deleteCharAt + lastIndexOf:aaa,aaa,aaa,aaaaaa //注意我这里是赋值给原始builder
setLength:aaa,aaa,aaa,aaaaa //注意我这里是赋值给原始builder
Joiner:bbb,bbb,bbb,bbb,bbb
前缀:0,1,2,3,4
【JS中字符串截取】
var str = 'Hello World!';
str=str.slice(0,str.length-1) //方式一(可以负数):Hello World
str=str.substr(0,str.length-1) //方式二(可以负数):Hello World
str=str.substring(0,str.length-1)//方式三(不能负数):Hello World
str=str.substring(0, str.lastIndexOf('!'));
str = str.substr(1); //删除第一个字符 ello World!
【35.日期字符串比较大小】
//第一种直接用字符串类的compareTo方法:
public static boolean compareNowDate1(String t1, String t2) {
int result = t1.compareTo(t2);
//result>0 则t1>t2;
//result<=0 则t1<=t2
return result > 0;
}
//第二种是把这个日期字符串转换成long:
public static boolean compareNowDate1(String t1, String t2) {
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
try {
Date d1 = format.parse(t1);
Date d2 = format.parse(t2);
long result = d1.getTime() - d2.getTime();
//result>=0 则value大于等于now
//result<0 则value小于now
return result > 0;
} catch (ParseException e) {
e.printStackTrace();
}
return false;
}
//第三种是把日期字符串转换成整形int:
public static boolean compareNowDate1(String t1, String t2) {
//可以try catch
int int1 = Integer.parseInt(t1);
int int2 = Integer.parseInt(t2);
int result = int1 - int2;
//result>=0 则value大于等于now
//result<0 则value小于now
return result > 0;
}
【番外:删除git账号】
[生成公钥:ssh-keygen -t rsa -c "xxxx@xxx.com"]三次回车
git 提取项目Authentication failed 和Incorrect username or password ( access token )的问题
接着怎么提取,都是这样,也不是会再次提示输入账号和密码;
解决办法:
1.控制面板进入用户账户
2.点击管理windows凭据
【36.隐藏App界面及图标】
<application
...
android:theme="@android:style/Theme.NoDisplay">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<!--无启动页面-->
<data
android:host=".app"
android:pathPrefix="/openwith"
android:scheme="myapp" />
</intent-filter>
</activity>
</application>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
...
android:theme="@android:style/Theme.NoDisplay">
</LinearLayout>
//无启动页面
//setContentView(R.layout.activity_main)
【39.绘制view宽高】
[https://blog.csdn.net/chenbaige/article/details/77991594]()
在activity中获取view 的尺寸大小(宽度和高度),若只写getWidth()、getHeight()等方法是获取不到View的宽度和高度大小的
疑问解答: 实际情况下,View的measure过程和Activity的生命周期方法不是同步执行的,因此无法保证Activity在执行完某个生命周期方法时View已经测量完毕了,这种情况下,获取到的尺寸大小就是0。
//1.Activity的 onWindowFocusChanged方法中获取:
//onWindowFocusChanged方法执行时代表View已经初始化完毕了,宽度和高度已经测量完毕并且最终确认好了,
//onWindowFocusChanged会执行多次,在Activity获取焦点和失去焦点时都会被调用一次。
// 即在onPause和onResume方法被执行时被反复调用。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
int width = bbb.getMeasuredWidth();
int height = bbb.getMeasuredHeight();
ZLog.e("1.view宽:" + width + " view高:" + height);
}
}
//2.View.post方法
//当执行到这个runable方法的时候,View所有的初始化测量方法说明都已经执行完毕了。
view.post(new Runnable() {
@Override
public void run() {
int width = bbb.getMeasuredWidth();
int height = bbb.getMeasuredHeight();
ZLog.e("2.view宽:" + width + " view高:" + height);
}
});
//3.ViewTreeObserver
//当View树的状态发生改变或者View树内部View的可见性发生改变的时候,onGlobalLayout将会被回调。
//注意:伴随着View树的状态改变,onGlobalLayout会被调用多次。
ViewTreeObserver observer = view.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
ZLog.e("3.view宽:" + width + " view高:" + height);
aaa.setMaxWidth(widthP - width - 10);//迟到了,aaa已经超过了这时width=0
}
});
//4.measure
//手动调用measure后,View会调用onMeasure方法对View发起测量,测量完后,就可以获取测量后的宽度和高度了。
//但是要对LayoutParams的参数分情况处理才能得到具体的参数值:
//4.1) View的LayoutParams参数为match_parent:
//这种情况下无法获取到具体宽高值,因为当View的测量模式为match_parent时,宽高值是取父容器的剩余空间大小作为它自己的宽高。
//而这时无法获取到父容器的尺寸大小,因此获取会失败。
//4.2) View的LayoutParams参数为具体值:(为0??)
int widthV = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.EXACTLY);
int heigtV = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.EXACTLY);
bbb.measure(widthV, heigtV);
int width1 = bbb.getMeasuredWidth();
int height1 = bbb.getMeasuredHeight();
ZLog.e("4.view宽:" + width1 + " view高:" + height1);
//4.3) wrap_content:可以用
int width22 = View.MeasureSpec.makeMeasureSpec((1 << 30) - 1, View.MeasureSpec.AT_MOST);
int height22 = View.MeasureSpec.makeMeasureSpec((1 << 30) - 1, View.MeasureSpec.AT_MOST);
bbb.measure(width22, height22);
int height222 = bbb.getMeasuredHeight();
int width222 = bbb.getMeasuredWidth();
ZLog.e("5.view宽:" + width222 + " view高:" + height222);
//aaa.setMaxWidth(widthP - width222 - 10);
【我用的此】
//(可以用)注意:View.MeasureSpec.UNSPECIFIED
//4.1当TextView的属性是wrap_content时,如何获取其宽度,特别是在界面还没显示时,比如像在RecycleView中的情况
int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
bbb.measure(spec, spec);
int width11 = bbb.getMeasuredWidth();
int height11 = bbb.getMeasuredHeight();
ZLog.e("4.1 view宽:" + width11 + " view高:" + height11);
【40.基本类型转字符串】
float+“”这个有个+号,是在常量池里操作的,会生成两个。所以
String.valueOf(float)相对好一点。
另外:+与StringBuider的对比 [https://mp.weixin.qq.com/s/dc7HW0SqEcJknMIqoQZnlg]()
【41.TextView变色】
[https://weilu.blog.csdn.net/article/details/52863741]()
text.setText(Html.fromHtml("商品编码<font color=red>*</font>:"));
text.setText(Html.fromHtml(String.format("商品编码<font color=red>*</font>:%s","22")));
//注意:html返回的是Spanned不是字符串,他继承CharSequence
//HTML的一些其他:https://blog.csdn.net/baidu_34012226/article/details/53301047
//2种:https://www.jianshu.com/p/f004300c6920 包括设置大小
SpannableStringBuilder builder = new SpannableStringBuilder(bar_code);
int index = bar_code.indexOf(etScan);
builder.setSpan(new ForegroundColorSpan(Color.RED), index,
index + etScan.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(builder);
//链接形式
android:autoLink 设置是否当文本为URL链接/email/号码/map时,文本显示为可点击的链接。
可选值:none/web/Email/phone/map/all
android:lineSpacingExtra="8dp" //是行间距,他默认是0,是一个绝对高度值。
lineSpacingMultiplier属性,它代表行间距倍数,默认为1.0f,是一个相对高度值。
android:text="揽件方式:上门取件\n快递公司:顺丰快递"
【42.限制EditText输入的小数的位数】
①xml中限制输入的类型:
android:inputType="numberDecimal"
②重写InputFilter
public class DecimalDigitsInputFilter implements InputFilter {
private final int decimalDigits;
public DecimalDigitsInputFilter(int digits) {
this.decimalDigits = digits;
}
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
// source:当前输入的字符
// start:输入字符的开始位置
// end:输入字符的结束位置
// dest:当前已显示的内容
// dstart:当前光标开始位置
// dent:当前光标结束位置
//Log.e("", "source=" + source + ",start=" + start + ",end=" + end + ",dest=" + dest.toString() + ",dstart=" + dstart + ",dend=" + dend);
if (dest.length() == 0 && source.equals(".")) {
return "0.";
}
String dValue = dest.toString();
String[] splitArray = dValue.split("\\.");
if (splitArray.length > 1) {
String dotValue = splitArray[1];
//输入框小数的位数是 decimalDigits 的情况时小数位不可以输入,整数位可以正常输入
if (dotValue.length() == decimalDigits && dest.length() - dstart <= decimalDigits) {
return "";
}
}
return null;
}
}
③设置小数点位数,这里传进去的是2位
edit.setFilters(new InputFilter[]{new DecimalDigitsInputFilter(2)});
【TextView代码设置展开与省略】
//TextView代码设置展开与省略
textView.setOnClickListener(v -> {
if (isShowDes) {
textView.setEllipsize(TextUtils.TruncateAt.END);
textView.setSingleLine();
} else {
textView.setEllipsize(null);
textView.setSingleLine(false);
}
isShowDes = !isShowDes;
});