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\NewArmsModuleMac 路径:
/Applications/Android\ Studio.app/Contents/plugins/android/lib/templates/gradle-projects/NewAndroidProject
Activity级模板
Windows路径:
D:\Android\AS3.6.2\plugins\android\lib\templates\activities\MVPArmsTemplatWindows 路径:
D:\Android\AndroidStudio\plugins\android\lib\templates\activities\U1LdyMvpActivityMac 路径:
/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.41
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  | 
