AS 快捷键
速查表列出了keymap
快捷键的名称. 可以直接通过AS setting
界面搜索keymap
. 通过对应的快捷键名称来添加或者修改快捷键.
功能描述 | keymap对应名字 | Mac | Win/Linux |
---|---|---|---|
提示错误解决方案 | Show Intention Actions | option + enter |
alt + enter |
AS配置界面 | Preferences | command + , |
control+alt+S |
工程项目配置界面 | Project Structure | command + ; |
Control+Alt+Shift+S |
快速构成代码 | Code Generate | command + N |
alt + insert |
代码提示 | Completion/Basic | control + space (mac会冲突, 手动修改) |
ctrl + 空格 (win同样大部分和输入法冲突, 手动修改) |
选择视图 | select in any view | option + F1 |
alt + F1 |
添加书签标识 | Toggle Bookmark | option + F3 |
ctrl + F11 |
显示书签 | Show Bookmarks | command + F3 |
shift + F11 |
添加书签 | Toggle Bookmark | F3 |
F11 |
向下移动一行 | Move Line Down | option + shift + Down |
alt + shift + Down |
向上移动一行 | Move Line Up | option + shift + Up |
alt + shift + Up |
注释代码 | Comment with Line Comment | command + / |
ctrl + / |
用代码模板包裹代码 | surround with Live Template | command + option + J |
ctrl + alt + J |
格式化代码 | Reformat Code | command + option + L |
ctrl + alt + L |
Copy Reference | Copy Reference | command + option + shift + C |
ctrl + alt + shift + C |
if/try等包裹代码 | Surround With.. | command + option + T |
ctrl + alt + T |
查看声明 | Declaration | command + B |
ctrl + B |
快捷向下复制行 | Duplicate Line or Block | command + D |
ctrl + D |
删除行 | Delete Line | command + delete |
ctrl + Y |
快捷最近打开 | Recent Files | command + E |
ctrl + E |
查找 | Edit/Find/Find | command + F |
ctrl + F |
全路径查找 | Find in Path | command + shift + F |
ctrl + shift + F |
文件方法结构(类似eclipse中的Ctrl+O) | File Structure | command + F12 |
ctrl + F12 |
代码高亮向下查找 | Move To Next Occurrence | command + G |
F3 |
代码高亮向上查找 | Move To Previous Occurrence | command + shift + G |
shift + F3 |
按照模板生成代码 | Insert Live Template | command + J |
ctrl + J |
定位到行 | Navigate/Line | command + L |
ctrl + G |
快速到行首/尾 | Move Caret to Line Start/End | command + Left/Right |
ctrl + Left/Right |
代码折叠/展开 | Collapse/Expand | command + 减号/加号 |
ctrl + 减号/加号 |
查找类 | Navigate/Class | command + O |
ctrl + N |
多行注释 | **Code/Comment ** | command + option + / |
ctrl + alt + / |
格式化代码 | Reformat Code | command + option + L |
ctrl + alt + L |
提示参数类型 | Parameter Info | command + P |
ctrl + P |
查找替换 | Replace | command + R |
ctrl + R |
查找命令 | Find Action | command + shift + A |
ctrl + shift + A |
拷贝文件路径 | Copy Paths | command + shift + C |
ctrl + shift + C |
移动代码块 | Move Statement Up/Down | command + shift + down/up |
ctrl + shift + down/up |
代码补全 | Complete Current Statement | command + shift + enter |
ctrl + shift + enter |
代码高亮 | Highlight Usages in File | command + shift + F7 |
alt + J |
窗口内所有代码折叠/展开 | Collapse/Expand All | command + shift + 减号/加号 |
ctrl + shift + 减号/加号 |
查找文件 | Navigate/File | command + shift + O |
ctrl + shift + N |
全路径中替换 | Replace in Path | command + shift + R |
ctrl + shift + R |
大小写转换 | Toggle Case | command + shift + U |
ctrl + shift + U |
显示粘贴版历史 | Paste from History | command + shift + V |
ctrl + shift + V |
快速查找定义 | command + space |
ctrl + shift + I |
|
粘贴 | Paste | command + V |
ctrl + V |
复制 | Copy | command + C |
ctrl + C |
去除无效包引用 | Optimize Imports | control + option + O |
ctrl + alt + O |
显示类关系继承体系 | Type Hierarchy | control + H |
ctrl + H |
快速覆写方法 | override Methods | control + O |
ctrl + O |
查找调用的位置 | Call hierarchy | control + option + H |
ctrl + alt + H |
扩大缩小选中范围 | Extend Selection/Shrink Selection | option + UP/Down |
ctrl + W + shift + W |
跳转到父类 | Super method | command + U |
ctrl + U |
关闭当前tab标签 | Editor Tabs / Close | command + W |
ctrl + shift + a |
关闭除编辑窗口的其余窗口 | Hide All Tool Windows | command + shift + F12 |
ctrl + shift + F12 |
预览方法定义 | Quick Definition | command + Y |
ctrl + shift + I |
返回光标最后编辑位置 | Last Edit Location | command + shift + delete |
control + shift + Backspace |
调到代码块首部/尾部 | Move Caret To Code Block | Option + Command + [ 或者 ] |
Control+[ 或者 ] |
重命名 | Rename | shift + F6 |
shift + F6 |
抽取方法 | Extract Method | command + option + M |
control+alt+M |
抽取变量 | Extract Variable | command + option + V |
control+alt+V |
抽取字段 | Extract Field | command + option + F |
control+alt+F |
抽取常量 | Extract Constant | command + option + C |
control+alt+C |
抽取参数 | Extract Parameter | command + option + P |
control+alt+P |
重构入口 | Refactor This | control + T |
ctrl + alt + shift + T |
打开文件 | 双击Shift | 双击Shift | |
撤销 | Command+Z | Ctrl+Z | |
前进 | Command+Shift+Z | Ctrl+Shift+Z |
Idea的Structure
(View–Tool Windows–Structure)类似于eclipse中的outline
代码中快捷键(Live Templates)
1 | C:\Users\monecity\.AndroidStudio3.6\config\templates |
1 | C:\Users\monecity\.AndroidStudio3.6\config\fileTemplates |
注意,上面的路径在AS4.1之后变了,具体可以这么找AS>File>Manage IDE Settings>Restore Default Settings...
在弹出框中可以看到新的路径(已经没有了config
和system
这俩目录)
1 | C:\Users\Administrator\AppData\Roaming\Google\AndroidStudio4.1\templates |
模板变量表达式含义表
以下是定义变量时支持的表达式基本含义(当匹配多个结果时结果将出现在待选列表中):
表达式 | 含义 |
---|---|
annotated(<annotation>) |
返回具有指定注解的类,方法或字段名 |
arrayVariable() |
返回当前范围内数组变量,最近的优先展示 |
lineCommentStart() |
返回当前语言指示行注释开始的字符 |
blockCommentStart() |
返回当前语言指示块注释开始的字符 |
blockCommentEnd() |
返回当前语言指示块注释结束的字符 |
commentStart() |
返回当前语言指示注释开始的字符,对有行注释的返回行注释开头 |
commentEnd() |
返回当前语言指示注释结束的字符,对有行注释的返回空(行注释通常没有结束字符) |
camelCase(<String>) |
将字符串转换为驼峰形式 |
snakeCase(<String>) |
将字符串转换为下划线分割形式 |
spaceSeparated(<String>) |
将字符串转换为空格分开形式 |
spacesToUnderscores(<String>) |
将字符串的空格替换为下划线 |
capitalize(<String>) |
将字符串首字母设为大写 |
capitalizeAndUnderscore(<String>) |
将字符串转换为大写并用下划线隔开 |
decapitalize(<String>) |
将字符串首字母设为小写 |
underscoresToCamelCase(<String>) |
将下划线形式字符串转换为驼峰形式 |
underscoresToSpaces(<String>) |
将下划线形式字符串转换为空格隔开形式 |
lowercaseAndDash(<String>) |
将字符串转为小写并使用中划线分割 |
escapeString(<String>) |
将字符串中的特殊符号进行转义,便于在java字符串中使用 |
substringBefore(<String>, <Delimeter>) |
截取字符串在<Delimeter> 之前的部分 |
firstWord(<String>) |
返回字符串中的首个单词 |
castToLeftSideType() |
获取左侧变量的类型判断是否需要强转 |
rightSideType() |
获取右侧表达式的变量类型 |
className() |
返回当前所在类(在内部类则返回内部类)类名 |
currentPackage() |
返回当前所在包名 |
qualifiedClassName() |
返回当前所在类(在内部类则返回内部类)的全限定类名(包+类名) |
classNameComplete() |
触发类名相关的代码补全 |
clipboard() |
返回系统剪贴板的内容 |
complete() |
调用一次代码补全,相当于调用一次_Ctrl+Space_ |
completeSmart() |
调用一次智能代码补全,相当于调用一次_Ctrl+Alt+Space_ |
componentTypeOf(<array>) |
返回数组类型 |
concat(<String>, …) |
拼接字符串 |
date([format]) |
指定格式化方式返回当前系统时间字符串(根据_SimpleDateFormat_ 格式) |
time([format]) |
指定格式化方式返回当前系统时间字符串(无日期,根据_SimpleDateFormat_ 格式) |
descendantClassesEnum(<String>) |
返回指定类的子类 |
lineNumber() |
返回当前行行号 |
enum(<String>, …) |
返回建议的字符串列表 |
expectedType() |
自动识别并返回期望的类型,一般用于赋值,方法参数,返回语句处。 |
fileName() |
返回当前文件名(带拓展名) |
fileNameWithoutExtension() |
返回当前文件名(不带拓展名) |
filePath() |
返回当前文件路径(带拓展名) |
fileRelativePath() |
返回当前文件相对当前项目的路径(带拓展名) |
groovyScript(<String>, [arg, …]) |
执行作为字符串形式传递的_groovy_ 脚本 |
guessElementType(<Collection>) |
返回集合中元素的类型 |
iterableComponentType(<Iterable>) |
返回可迭代对象的类型 |
iterableVariable() |
返回当前范围内可迭代类型对象,最近的优先展示 |
methodName() |
返回当前所在方法名 |
methodParameters() |
返回当前所在方法的所有参数名 |
methodReturnType() |
返回当前所在方法的返回类型 |
regularExpression(<String>, <Pattern>, <Replacement>) |
查找字符串中满足<Pattern> 的所有部分并替换为<Replacement> |
typeOfVariable(<String>) |
返回变量的类型 |
variableOfType(<String>) |
返回当前范围内满足类型条件的变量,最近的优先展示 |
suggestFirstVariableName(<String>) |
返回当前范围内满足类型条件的部分变量,最近的优先展示和_variableOfType_ 类似但不推荐true,false,this,和super |
subtypes(<String>) |
返回指定类型的子类型 |
suggestIndexName() |
返回当前范围中未使用的第一个常用迭代下标变量名(i,j,k等) |
suggestVariableName() |
根据变量命名规则的代码风格设置返回建议的变量名 |
suggestShortVariableName() |
建议的变量名精简版 |
user() |
返回当前系统的用户名称 |
shenbh
* 方法注释
1 | * <pre> |
使用的时候 “/**
+Tab”
add “增加”注释
1 | //region add by shenbh on $DATE$ $END$ |
anno annotation添加方法注释
1 | /** |
db 添加switch的默认项
1 | default: |
doublesingleton 双重锁定创建单例模式,开销较大
1 | public static $CLASS_NAME$ getInstance(){ |
doubleSingleWithContext 双重锁定创建单例模式,带Context
1 | public static $CLASS_NAME$ getInstance(Context context){ |
hand 创建自己的Handler
1 | private class MyHandler extends Handler { |
mdf “修改”注释
1 | //region modify by shenbh on $DATE$ $END$ |
newFragment 创建fragment
1 | public $CLASS_NAME$(){} |
note 类注释
1 | /** |
staticClassSingleton 静态内部类单例,无法传参
1 | private static final String TAG = "$CLASS_NAME$".class.getName(); |
ma “Module annotations模块注释”
1 | //region ******$END$******* |
psv “public static void”
1 | public static void $END$ |
sw “switch”
1 | switch(view.getId()){ |
todo 添加 // TODO
1 | //TODO: shenbh $date$ $todo$ |
try “creat try-catch”
1 | try { |
u1city
layout “create layout res id const”
1 |
|
lth “get thumbnail and set”
1 | MonCityImageLoader.getInstance().loadImage(PictureSpaceCenter.getHandledUrl(App.getContext(), picUrl,_SIZE), |
mrx “MVP中 m层 RxRequest”
1 | public Observable<String> $name$(final int indexPage, final int pageSize) { |
ob
1 | if (pIsLoadByRefresh) { |
prx “MVP中 p层Rx请求”
1 | public void $name$(final boolean pIsLoadByRefresh){ |
rxrequest “p层使用。do request by rx”
1 | if (pIsLoadByRefresh) { |
rgc “get Color from resource”
1 | ContextCompat.getColor(mContext, R.color.$END$) |
rgd “get a Drawable from resources”
1 | ContextCompat.getDrawable(mContext, R.drawable.$END$) |
rgs “get String from resource”
1 | ContextCompat.getString(mContext, R.string.$END$) |
rv “init RecyclerView”
1 | LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); |
srl “init SmartRefreshLayout”
1 | mSmartRefreshLayout.setEnableHeaderTranslationContent(false); |
ArmsMVP
armsContract MVPArms的Contract
1 | import android.app.Activity; |
armsmrx MVPArms的M层Rx请求
1 |
|
armsprx MVPArms的P层Rx请求
1 |
|
tmpdata 临时数据
1 | // TODO: 2020/6/1 |
xm597
gerenActivity 创建个人Activity
1 | import android.content.Context; |
gerenBean 创建个人Bean
1 | public class $entityName$Bean extends GeRenBaseBean { |
gerenContract 创建个人Contract
1 | import com.xm597.app.project.ui.base.presenter.IBaseUI; |
gerenFragment 创建个人Fragment
1 | public class $entityName$Fragment extends BaseFragment<Fragment$entityName$Binding, $entityName$Presenter> |
其中的构造方法必须是public,在某些API中(好像是安卓10)用的是反射,私有的反射不出来,会有找不到构造方法的异常。
gerenParams 创建个人Params
1 | public class $entityName$Params extends GeRenBaseParams { |
gerenPresenter 创建个人Presenter
1 | import androidx.lifecycle.LifecycleOwner; |
gerenRequest 创建个人Request
1 | import com.xm597.app.project.api.base.request.GeRenBaseRequest; |
gerenXML 创建个人XML
1 |
|
ob xm597 persenter内某方法的请求
1 | //TODO:改成调用BasePresenter内的方法(传对应的参数) |
创建类时的类型(File and Code Templates)
java类型
DoubleCheckSingleton
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
u1city
LdyActivity
1 | #if (${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
LdyFragments
包含多个子Fragment
1 | #if (${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
MvpBean
1 | #if (${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
MvpContract
1 | #if (${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
MvpDgActivity
1 | #if (${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
MvpItemAdapter
1 | #if (${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
MvpLdyActivity
1 | #if (${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
MvpLdyFragment
1 | #if (${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
MvpModel
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
MvpPresenter
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
StaticClassSingleton
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
Arms
ArmsActivity
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
ArmsAdapter
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
ArmsAutoView
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
ArmsComponent
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
ArmsContract
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
ArmsFragment
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
ArmsModel
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
ArmsModule
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
ArmsPresenter
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
升级版ArmsComponent
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
升级版ArmsModule
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
升级版ArmsActivity
1 | #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end |
xml类型
mvp 的 activity_${layoutname}
1 |
|
LdyFragment的布局文件 fragment_${layoutname}
fragment带多个子fragment
1 |
|
AS自己写模板
(在AS 4.0以下可用)
AS安装插件 TemplateBuilder
module级模板
Windows 路径:
D:\Android\AS3.6.2\plugins\android\lib\templates\gradle-projects\NewArmsModule
Mac 路径:
/Applications/Android\ Studio.app/Contents/plugins/android/lib/templates/gradle-projects/NewAndroidProject
Activity级模板
Windows路径:
D:\Android\AS3.6.2\plugins\android\lib\templates\activities\MVPArmsTemplat
Windows 路径:
D:\Android\AndroidStudio\plugins\android\lib\templates\activities\U1LdyMvpActivity
Mac 路径:
/Applications/Android\ Studio.app/Contents/plugins/android/lib/templates/activities/U1LdyMvpActivity
定义模板
首先创建一个MVP的Activity,将动态的属性声明为变量。
1 | package ${packageName}; |
创建对应的Layout布局文件
1 |
|
生成模板
选中两个模板文件,点击【ALT + T】,弹出【Configure Template Data】窗口。定义activityClass、layoutName、titleName三个变量,并【Finish】,生成模板。
模板文件存放在…\Android Studio\plugins\android\lib\templates下
属性说明:
- Template Category 对应模板的分类,对应选择导入模板时的模板分类,这里默认值是电脑的用户名。
- Template Name 对应模板名称,对应选择导入模板时的模板名称,默认值是当前的Project名称。
- Template Description 对应模板描述信息,对应导入模板时弹出的导入界面的文字描述,默认为空。
- Template Folder 对应生成模板所存放的位置,如果是Mac操作系统则默认为/Applications/Android Studio.app/Contents/plugins/android/lib/templates, Windows系统的话由于差异比较大,就默认为空了,可以自行配置[Android Studio安装目录]/plugins/android/lib/templates(这里只需要配置一次即可,插件将自动保存该位置)。
- Input data 配置模板变量
在【Configure Template Data】下点击【add】配置刚才模板中定义的变量,配置完毕后点击【Finish】。
重启Studio后就可使用该自定义模板。
关于Input data的使用,先解释下每个属性对应的含义
- id 变量名,必须和模板中使用的变量名对应,必填
- name 变量简介,必填
- type 变量类型,string和boolean两种,通过下拉框选择,必填
- default 变量对应的默认值,选填
- help 添加该变量时的提示信息,选填
模板文件后缀名都是以【.ftl】结尾。
globals.xml.ftl 全局变量文件 存放的是一些全局变量
recipe.xml.ftl 配置要引用的模板路径以及生成文件的路径
template.xml 模板的配置信息,以及要输入的参数.定义了模板的流程框架 基本结构
template_blank_activity.png 显示的缩略图(只是展示用)
LinActivity.java.ftl Activity模板文件
修改template.xml文件
为方便用户输入Activity名称或Layout名称,自动提示Layout或Activity名称,需要在文件中添加两个属性:
constraints=”class|unique|nonempty”
suggest=”${layoutToActivity(layoutName)}”
suggest=”${activityToLayout(activityClass)}”
修改AndroidManifest.xml文件
1 |
|
增加Kotlin模板
AS4.1上写模板【新方式】
(AS4.+以上可用。在AS 2020.3.1【这个得改】上用不了)
步骤:
打开https://github.com/JetBrains/intellij-platform-plugin-template,点击绿色按钮“Use this template”就会fork一份代码到你自己的仓库。然后通过git工具clone到电脑上,用AS4.1+打开
修改包名、修改
MyProjectManagerListener.kt
、修改build.gradle.kts
、修改gradle.properties
在
src/main/kotlin/
下新增个文件夹other
,用来放自己写的具体模板还要在
src/main/resources/META-INF/plugin.xml
中添加以下内容,才能让自己写的具体模板内容生效1
2
3
4
5<extensions defaultExtensionNs="com.android.tools.idea.wizard.template">
<!-- <wizardTemplateProvider implementation="other.temparms.ArmsPluginTemplateProviderImpl" />-->
<!-- <wizardTemplateProvider implementation="other.xm597.Xm597PluginTemplateProviderImpl" />-->
<wizardTemplateProvider implementation="other.mvvm.SamplePluginTemplateProviderImpl" />
</extensions>在Terminal上输入
gradlew buildPlugin
来生成模板jar文件(在项目的build/libs
下)AS导入模板(
File》Settings》Plugins》Install Plugin from Disk...
)
注意:
gradle-wrapper.properties
中gradle版本与build.gradle.kts
中配置的版本是对应的gradle.properties
中platformVersion
的值为2020.2.4
在AS4.1.2
和AS4.1.3
上无法正常编译模板,需要在AS4.2-Beta5
上才行。所以在AS4.1.2
上这个值改成了2020.1.4
1
2
3
4pluginVerifierIdeVersions = 2020.1.4 , 2020.2.4, 2020.3.2, 2021.1
platformType = IC
platformVersion = 2020.1.4
代码结构截图
完整代码(动过的):
配置相关
src/main/kotlin/com/xml597/app/template/listeners/MyProjectManagerListener.kt
1 | package com.xm597.app.template.listeners |
build.gradle.kts
1 | import io.gitlab.arturbosch.detekt.Detekt |
gradle.properties
1 | # IntelliJ Platform Artifacts Repositories |
settings.gradle.kts
1 | rootProject.name = "xm597 Plugin Template" |
src/main/resources/META-INF/plugin.xml
1 | <idea-plugin> |
具体模板详情
以src/main/kotlin/other/mvvm
为例
src/main/kotlin/other/mvvm/SamplePluginTemplateProviderImpl.kt
1 | package other.mvvm |
src/main/kotlin/other/mvvm/activity/mvvmActivityTemplate.kt
1 | package other.mvvm.activity |
src/main/kotlin/other/mvvm/activity/mvvmActivityRecipe.kt
1 | package other.mvvm.activity |
src/main/kotlin/other/mvvm/activity/res/layout/mvvmActivityXml.kt
1 | package other.mvvm.activity.res.layout |
src/main/kotlin/other/mvvm/activity/src/app_package/mvvmActivity.kt
1 | package other.mvvm.activity.src.app_package |
src/main/kotlin/other/mvvm/activity/src/app_package/mvvmRepository.kt
1 | package other.mvvm.activity.src.app_package |
src/main/kotlin/other/mvvm/activity/src/app_package/mvvmViewModel.kt
1 | package other.mvvm.activity.src.app_package |