前言
这只是记录下开发过程中常用的api,是经常可能忘了导致去百度的
我还是希望大家最好记在脑子里,需要也提倡查找api,但我感觉只有记住了才能融会贯通,满足需求。每次查出来的,怕不了解,不敢修改等等就不好了
我会记住确定不会忘了,我就会删除一条。如果第二次进来看到怎不见了呢,也不用吃惊哈,序号也会没有
开始吧
1、禁止用户按返回键关闭界面
Api: onKeyDown return true即可
代码如下:
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
if (keyCode == KeyEvent.KEYCODE_BACK ) {
return true//不执行父类点击事件
}
return super.onKeyDown(keyCode, event)
}
2、获取资源颜色快捷方法
Api: ContextCompat.getColor(mActivity!!, R.color.m_red_one)
示例代码:
tv.setTextColor(ContextCompat.getColor(mActivity!!, R.color.m_red_one))
3、动态添加布局
Api: LayoutInflater.from
平常都是工具类封装好,希望没有封装时,也能随手写出来
注意:这个方法参数还有点玄学,自己研究了
示例代码:
LayoutInflater.from(mActivity).inflate(R.layout.login_study_plan_job_item, ll_job, false)
4、RecyclerView添加item间距
Api: rv.addItemDecoration
示例代码:
rv_learn_direction.addItemDecoration(object :RecyclerView.ItemDecoration(){
override fun getItemOffsets(outRect: Rect, itemPosition: Int, parent: RecyclerView?) {
super.getItemOffsets(outRect, itemPosition, parent)
outRect.right = UtilHelper.dip2px(mActivity,16f)
outRect.bottom = UtilHelper.dip2px(mActivity,16f)
}
})
注意这个添加一次,也就是这代码只能运行一次,因为每次addItemDecoration都是有效的,会叠加间距。
所以一般放在初始化操作,不要放在接收数据,操作adapter时操作。
5、监听EditText的输入改变
Api:addTextChangedListener
6、adapter的item的点击事件
Api:onItemClickListener
示例代码:
getAdapter()?.onItemClickListener = object :BaseQuickAdapter.OnItemClickListener{
override fun onItemClick(adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int) {
val item = getAdapter()!!.data[position]
}
}
}
8、adapter的item里面某个控件的点击事件
helper.addOnClickListener(R.id.tv_report)
getAdapter()?.setOnItemChildClickListener { _, view, position ->
when (view.id) {
R.id.tv_report -> {
7、fragment代替布局,动态添加
示例代码:
val tr = supportFragmentManager.beginTransaction()
tr.replace(R.id.fl_content, ActiveFragment.getInstance())
tr.commitAllowingStateLoss()
8、点击切换fragment
示例代码:
fun switchFragment(posFragment: Int) {
var fragment: Fragment? = null
when (posFragment) {
0 -> {
if (ceoActiveFragment == null) {
ceoActiveFragment = CEOActiveFragment.getInstance(source,position,sum,sheng_id,shi_id, qu_id)
}
fragment = ceoActiveFragment
}
1 -> {
if (ceoTaskFragment == null) {
ceoTaskFragment = CEOTaskFragment.getInstance(source,position,sum,sheng_id,shi_id,qu_id)
}
fragment = ceoTaskFragment
}
}
if (fragment == null) {
return
}
val trx = supportFragmentManager.beginTransaction()
//隐藏当前fragment
if (null != mCurrentFragment) {
trx.hide(mCurrentFragment!!)
}
if (!fragment.isAdded) {
trx.add(R.id.fl_content, fragment)
} else {
trx.show(fragment)
}
mCurrentFragment = fragment
trx.commitAllowingStateLoss()
}
9、TextView也可以中间省略号
android:ellipsize="middle"
示例代码:
android:ellipsize="middle"
android:maxWidth="110dp"
android:singleLine="true"
10、canvas绘制图片
drawBitmap
示例代码:
canvas.drawBitmap(bitmap, left, top, paintImage);
11、以SP单位设置TextView的textSize
TypedValue.COMPLEX_UNIT_SP
示例代码:
bar_title.setTextSize(TypedValue.COMPLEX_UNIT_SP,17f)
12、TextView显示html富文本
示例代码:
String result = "实时更新中,当前股票行情:<font color='red'>%d</font>";
result = String.format(result, (int) (Math.random() * 5000 + 1000));
mTv.setText(Html.fromHtml(result));
13、放快速双击
RxView.clicks(tv_video_price)
.throttleFirst(2, TimeUnit.SECONDS)
.subscribe(object : Consumer<Any> {
override fun accept(t: Any?) {
//弹出视频详情,视频暂停
}
})
14、对于Application,Service,Activity三者的应用场景
new View(context) 也可以用Application的
15、Android自带的判断是否有某个权限
ContextCompat.checkSelfPermission
示例代码:
if (ContextCompat.checkSelfPermission(activity!!, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
//不具有打电话权限,需要进行权限申请
ToastUtils.showCustomToast("没有电话权限")
return
}
判断某个权限是否永久拒绝(需要在拒绝里面进一步判断):
if(!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CALL_PHONE)){
}
16、单独刷新某一Item
notifyItemChanged(position)
示例代码:
if (getHeaderLayoutCount() > 0) {
notifyItemChanged(i + getHeaderLayoutCount(), "点赞成功");
} else {
notifyItemChanged(i, "点赞成功");
}
break;
17、控件执行补间动画
AnimationUtils.loadAnimation
示例代码:
var translateAnim = AnimationUtils.loadAnimation(this,R.anim.view_anim)
tv_content.startAnimation(translateAnim)
18、控件执行属性动画
ObjectAnimator.ofFloat
示例代码:
ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"rotationX",0,270,0);
animator.setDuration(2000);
animator.start();
19、正确的List遍历方法
Iterator iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
20、requestLayout,invalidate,postInvalidate
invalidate :只调onDraw(),在UI线程调用
postInvalidate:只调onDraw(),在子线程调用
requestLayout:onMeasure、onLayout、onDraw ,在UI线程调用
21、Float相加减精度问题
切记float类型的相加减运算多次很容易出问题
示例代码:
public static double addTwo(double a, double b) {
BigDecimal bd1 = new BigDecimal(Double.toString(a));
BigDecimal bd2 = new BigDecimal(Double.toString(b));
return bd1.add(bd2).doubleValue();
}
22、每个Intent中只能指定一个action,但能指定多个category。新指定的category也需要在隐式启动时添加
只有当<data>标签中指定的内容和Intent中携带的Data完全一致时,当前Activity才能够响应该Intent。
23、在一个activity启动模式为singleTop且本身在前台时,再次启动当前activity的生命周期如下:
onPause()->onNewIntent->onResume
24、假设:先启动Activity A->在Activity A中启动Activity B->按Back键
按Back键时的生命周期为B.onPause()->A.onRestart->A.onStart->A.onResume-> B.onStop->B.onDestroy
25、补充:灭屏时,onPause()和onStop()会依次被调用
屏亮时,onRestart(),onStart(),onResume()会依次被调用
26、Arrays.asList()方法接受一个数组或者一个用逗号分隔的元素列表
Arrays.asList(1,2,3,4,5)
27、不知道LinearLayout还是其他布局,可以用ViewGroupParams
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams)getLayoutParams()