设置EditText获取焦点并弹出软键盘及手动关闭软键盘
- 设置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);
}
- 关闭软键盘
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)
}
- 让EditText的输入法消失,给别的控件设置Focusable和FocusableInTouchMode,这样当EditText失去Focus时,输入法即被隐藏。
android:focusable="true"
android:focusableInTouchMode="true"
- 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的三大流程)
参考资料
模拟器端口
1.通过任务管理器找到他们的pid
2.然后通过cmd命令查看占用看了哪个端口:
netstat -ano | findstr "1080"
1080是pid,根据自己找到的pid来更改命令
framework.jar
有时候开发需要一些依赖framework中隐藏方法的时候,我们可以导入framework.jar, 编译的时候依赖framework,Android studio中导入framework.jar包的方式,其他系统jar包的导入方式同理。
- 将framework.jar拷贝到项目的/libs文件夹中,右键framework.jar文件,Add as Library ,并在Project Structure中改变framework.jar的作用域属性,将framework.jar的Scope改为只参与编译(CompileOnly)
- 改了framework.jar 的scope后,再在修改project的build.gradle文件,注意注释的重点
allprojects {
repositories {
google()
jcenter()
}
//这里是重点
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\framework.jar')
}
}
}