简化开发Android开发

Android开发个人总结常用的api

2020-12-31  本文已影响0人  你的益达233

前言

开始吧

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三者的应用场景

context.png

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()

上一篇 下一篇

猜你喜欢

热点阅读