Android 随笔-先记录以后可扩展

261 阅读3分钟

设置EditText获取焦点并弹出软键盘及手动关闭软键盘


  1. 设置EditText获取焦点并弹出软键盘
private fun showSoftInput(activity: Activity, editText: EditText) {
    //方法一:
    editText.requestFocus()
    activity.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
    
    
    //方法二:这个是强制输入法弹出,推荐使用方法一
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_NOT_ALWAYS);
}
  1. 关闭软键盘
private fun hideSoftInput(activity: Activity) {
    var view = activity.currentFocus
    if (view == null) {
        view = View(activity)
    }
    val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0)
}
  1. 让EditText的输入法消失,给别的控件设置Focusable和FocusableInTouchMode,这样当EditText失去Focus时,输入法即被隐藏。
    android:focusable="true"
    android:focusableInTouchMode="true"
  1. EditText不自动弹出输入法,由于EditText会被Framework自动设置焦点。所以只要让EditText显示时不获取焦点即可,给父控件设置
    android:focusable="true"
    android:focusableInTouchMode="true"

或者给别的控件设置requestFocus()方法

ProgressBar相关


//切换ProgressBar颜色
android:indeterminateTint="#d38fdb"

requestLayout、invalidate、postInvalidate三个方法的理解


//requestLayout方法递归调用父容器的requestLayout
//最终调用ViewRootImpl的requestLayout,并在调用过程中为View设置标志位
//ViewRootImpl会调用三大流程,从Mesure开始,对于每个含有标记的view及其子view进行测量、布局、绘制
//invalidate在UI线程调用该方法
//当子View调用invalidate方法后,会为View添加一个标记位,同时不断向父容器请求刷新
//父容器通过计算得出自身需要绘制的区域,直到传递到ViewRootImpl,最终触发performTraversals方法,开始View树的重绘流程(只绘制需要重绘的视图,在传递的过程中已经得出了需要重绘的视图的位置信息)
//postInvalidate在非UI线程中调用
//首先调用ViewRootImpl#dispatchInvalidateDelayed方法,使用Handler,发送一个异步消息到主线程,MSG_INVALIDATE,即通知主线程刷新视图,msg传递了View视图的实例,然后直接调用invalidate方法,最终流程和invalidate一样

一般来说,如果View确定自身不再适合当前区域,比如说它的LayoutParams发生了改变,需要父布局对其进行重新测量、布局、绘制这三个流程,往往使用requestLayout。而invalidate则是刷新当前View,使当前View进行重绘,不会进行测量、布局流程,因此如果View只需要重绘而不需要测量,布局的时候,使用invalidate方法往往比requestLayout方法更高效。(通过给View设置标志位来控制View的三大流程)

参考资料

blog.csdn.net/a553181867/…

模拟器端口


1.通过任务管理器找到他们的pid
2.然后通过cmd命令查看占用看了哪个端口:
    netstat -ano | findstr "1080"
1080是pid,根据自己找到的pid来更改命令

framework.jar

有时候开发需要一些依赖framework中隐藏方法的时候,我们可以导入framework.jar, 编译的时候依赖framework,Android studio中导入framework.jar包的方式,其他系统jar包的导入方式同理。

  1. 将framework.jar拷贝到项目的/libs文件夹中,右键framework.jar文件,Add as Library ,并在Project Structure中改变framework.jar的作用域属性,将framework.jar的Scope改为只参与编译(CompileOnly)
  2. 改了framework.jar 的scope后,再在修改project的build.gradle文件,注意注释的重点
allprojects {
    repositories {
        google()
        jcenter()
        
    }
    //这里是重点
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\framework.jar')

        }
    }
}