1. 输入密码界面,密码的可见不可见,使用CheckBox
输入内容的显示和隐藏
et_password.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); //密码可见
et_password.setTransformationMethod(PasswordTransformationMethod.getInstance());//密码不可见
16. 开关控件:SwitchCompat与Switch设置宽度,一个是app下的switchMinWidth,一个是android下的switchMinWidth
<android.support.v7.widget.SwitchCompat
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="10dp"
app:switchMinWidth="60dp"/>
<Switch
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="10dp"
android:switchMinWidth="60dp"/>
17. listView的item无响应
在item最外层添加属性 android:descendantFocusability=”blocksDescendants”
ListView setOnItemClickListener 事件无响应的解决办法
ListView setOnItemClickListener无效原因分析
18. Android TextView实现下划线的几种方式 SpannableString和SpannableStringBuilder总结
19. RelativeLayout中包含Button/ImageButton等可点击控件,若想实现整个布局都可点击,最好在Java文件中给RelativeLayout、Button/ImageButton都设置click点击事件。若只设置RelativeLayout的点击事件,可能出现点击了Button/ImageButton控件,但无效果的情况。
20. CheckBox下setChecked(true)方法会触发setOnCheckedChangeListener的onCheckedChanged()方法,若需要只有手动点击时,才触发该方法,可以用isPressed()方法:
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (!compoundButton.isPressed()) return;
}
});
21
ProgressBar用于展示
SeekBar是ProgressBar的一个子类,展示的同时,可拖拽-要实现SeekBar.OnSeekBarChangeListener接口
progressBar与seekBar区别_lollipop的专栏-优快云博客
Android攻城狮SeekBar制作可拖动的进度条 - 张兮兮 - 博客园
AppCompatSeekBar 是SeekBar的子类
setOnSeekBarChangeListener(SeekBar.OnSeekBarChangeListener arg)
Android 自定义SeekBar(滑块跟随进度条移动) - 知乎
AppCompatSeekBar | Android Developers
22. Android Viewpager切换焦点问题,ScrollView,ListView, seekBar发生位移
23. kotlin和Java的split()方法,返回值不同
24. 正则表达式提取字符串中的数字
25. Objects.util(null, null) = true;
26. RelativeLayout 内有ImageButton 或 View设置了onClick方法后,RelativeLayout的点击事件不会触发:把ImageButton换成ImageView
27. androidX和V4包冲突,解决方法:
在项目主目录下的gradle.properties中添加以下代码
android.enableJetifier=true
android.useAndroidX=true
28. 隐式intent至少包含"android.intent.category.DEFAULT"(对应CATEGORY_DEFAULT常量)
29. viewPager#registerOnPageChangeCallback
ViewPager2.OnPageChangeCallback
onPageSelected:滑屏/点击Tab都会走到这
onPageScrollStateChanged:只有滑屏才会走到这
30. ViewPage放fragment ,onCreateView方法没有被执行:解决方法 设置ViewPager的setOffscreenPageLimit
31. Android recyclerView每次刷新数据后都会定位在第一条_奋斗的小欣-优快云博客
32. CopyOnWriteArrayList 和 CopyOnWriteArraySet
java.util.ConcurrentModificationException
com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96)
解决方案
该异常表示迭代器迭代过程中,迭代的对象发生了改变,如数据项增加或删除。
[解决方案]:由于迭代对象不是线程安全,在迭代的过程中,会检查modCount是否和初始modCount即expectedModCount一致,如果不一致,则认为数据有变化,迭代终止并抛出异常。常出现的场景是,两个线程同时对集合进行操作,线程1对集合进行遍历,而线程2对集合进行增加、删除操作,此时将会发生 ConcurrentModificationException 异常。
具体方法:多线程访问时要增加同步锁,或者建议使用线程安全的集合:
1. 使用 ConcurrentHashMap 替换 HashMap,CopyOnWriteArrayList 替换 ArrayList, CopyOnWriteArraySet 替代 HashSet;
2. 或者使用使用Vector替换ArrayList,Vector是线程安全的。Vector的缺点:大量数据操作时,由于线程安全,性能比ArrayList低.
33. 最后一定会释放锁的操作
lock.lock(); // 加锁
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1); // 拷贝新数组
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock(); // 释放锁
}
34. 集合的去重、求交集等: removeAll / addAll / retainAll