前言
- 本文主要介绍一些易忽略或者易忘的
AndroidStudio
操作,以及一些Android
入门前应该对开发工具的必要了解 - 实际上
Android Studio
为开发者提供了许多很方便的工具,只要我们能有效的利用,不论是对于初学者,还是说对于一个成熟开发者对产品的快速迭代,都是非常有好处的;正所谓工欲善其事,必先利其器,在入门之前对我们的开发工具有一个大致的了解,将会使我们少走很多弯路. - 另一方面是,
Android Studio
中也有很多优秀的示例(由Google
官方提供的),这些也可以让我们一览Google
官方所提倡的UI
设计和界面交互等理念,而这些对于我们今后的学习入门和进阶都是具有指导意义的 - 更详细的可参见 Android文档
AndroidStudio初探
导入项目
-
File > New > Project from Version Control
可以导入github
上的项目,但是首先应该先在AndroidStudio
上登录
创建Android Library(AAR)
作用
- 当多个
APP
中使用了相同的部分时,可以将相同部分封装为一个模块(包括Activity
,Service
,Layout
等) - 当
APP
需要运行在多个APK
版本中时,并且需要同样的组件时
创建
-
File > New > New Module
,选择Android Library
- 在该界面还可以创建
Java Library
(即平时的jar
文件),但是二者的区别是,AAR
还可以包含一些Android
资源文件和Manifest
文件 - 有时可能需要手动在
App Module
的build.gradle
中导入implementation project(":my-library-module")
(但是通常都可以通过AS
的Alt+Enter
自动导入) - 如何将一个
APP Module
转换为Library Module
呢: 首先打开Module
级别的build.gradle
文件(注意和另一个Project
级别的build.gradle
文件相区分),然后删除其中的applicationId
(这是只有一个app module
才能拥有的东西);然后将首部的apply plugin: 'com.android.application'
改成apply plugin: 'com.android.library'
;最后Sync Projcet
导入AAR
- 导入已经编译过的
ARR
(一般在[ModuleName]/build/outputs/aar/[ModuleName]-debug.aar
目录下)或者JAR
文件,首先File > New > New Module
,选择Import .JAR/.AAR Package
;如果是没有编译过的模块,直接File > New > Import Module
即可 - 之后在
setting.gradle
中添加:include ':app', ':my-library-module'
(一般会自动添加) - 最后在
APP Module
中添加
dependencies {
compile project(":my-library-module")
}
使用模板
Basic Activity
- 从该模板代码中可以借鉴的是,将中间要显示的内容与外部的布局框架分离,其实文档中也有介绍
Two layout files: one for the activity and one to separate out text content
;大意就是说,该Activity
包含了两个布局文件,将内容和布局分开 - 还有就是应该将所有的常量写成资源文件,比如说组件的
margin
属性,可以定义在resource/dimen
文件中 - 另一个就是
FloatingActionButton
的响应事件,如果要用一个类似底部的Toast
的话,可以借鉴其写法(这种是会在消息显示的时候FloatingActionButton
会自动向上让出合适位置) - 借鉴在底部显示
Toast
的方法
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
Bottom Navigation Activity(底部导航栏)
- 底部导航栏设计文档
- 注解的使用
onNavigationItemSelected(@NonNull MenuItem item)
- 底部导航切换的时候,文字会变大的动画效果
- 使用
vector
制作icon
Fullscreen Activity(全屏)
- 使用
FrameLayout
来设置组件的layout_gravity
属性 - 使用
Handler
实现,但是应该注意的是在每次隐藏和显示的时候应该取消前面任务队列中的显示和隐藏任务,这是为了防止用户连续点击时出现问题
mHideHandler.removeCallbacks(mHidePart2Runnable);
mHideHandler.postDelayed(mShowPart2Runnable, UI_ANIMATION_DELAY);
Login Activity(登录界面)
- 这里可以学到的是,在
LinearLayout
的vertical
布局中,对前一个组件设置的layout_marginBottom
属性实际上是对其后的紧邻组件起作用;同理在horizontal
布局中对左边的组件使用layout_marginRight
属性实际上也是对紧邻其右边的组件起作用 - 当输入框获得输入焦点的时候,
hint
的提示文字会自动上浮的动画,其实这个是TextInputLayout
的动画效果,使用该布局的时候必须包含一个EditText
或者其子类,而且只能是一个布局包含一个EditText
;同时也推荐使用该布局加EditText
来编写登录和输入密码组件,特别时输入密码的时候还可以通过设置setPasswordVisibilityToggleEnabled(boolean)
来设置密码是否可以在明文之间切换 - 使用
TextUtils
工具类对字符串进行操作,包括判null
等 - 使用
AutoCompleteTextView
来设置自动提示(类似与输入历史记录) - 使用
EditText.setError()
方法来设置错误提示,这个其实是TextView
的方法,只是EditText
继承了TextView
;该方法会在EditText
的末尾显示一个带Icon
的popupWindow
,还可以自己通过该方法设置Icon
;(所以以后就不要用什么Toast
这种low
的东东咯)
Master/Detail Flow(主列表与详细信息)
- 借鉴在代码中指定
layoutManager
:app:layoutManager="LinearLayoutManager"
- 将布局文件模块化和分离,同时在布局文件中指定
RecyclerView
的Item
项和context
项
tools:context="com.example.yuanping.temp.templates.ItemListActivity"
tools:listitem="@layout/item_list_content"
- 对于使用
RecyclerView
展示列表时,使用FrameLayout
来封装
Navigation Drawer Activity(侧滑菜单)
- 菜单与主界面布局分离,也要注意界面布局的模块化,可以将一些复杂的布局拆分成为模块,然后封装为不同的
layout
资源文件,用include
引用即可
Tabbed Activity(支持左右滑动)
- 一个使用
ViewPager
和Fragment
创建的支持左右滑动界面;该模板也提供了ViewPager
和Fragment
的基本使用
正确添加资源文件
使用AS
提供的面板拖拽控件
- 官方推荐使用
ConstraintLayout
来与之配合使用,这样可以减少直接用代码画XML
- 拖拽的时候需要对每一个组件至少设置垂直和水平约束,对于没有约束的组件,在实际运行的时候会默认跑到左上角
使用AS
实现多语言
- 即将平时项目中的
string
都写为资源文件string.xml
,然后利用AS
自带的翻译工具进行翻译,也可以自备多语言的string.xml
文件
使用Image Asset Studio
制作ICON
- 支持制作的
ICON
有Launcher icons
(在res/mipmap-density/
中),Action bar and tab icons
(res/drawable-density/
中),Notification icons
(res/drawable-density/
中)等;该工具可以自动生成支持多种不同密度的图标,同时在运行时,系统会自动根据当前屏幕密度来适配不同的图标 - 可以自己导入图片制作图标,但是需要注意的是导入图片时推荐使用
png
格式的,jpg
格式的图片在文档的描述是acceptable
即可接受的 - 可以通过右击
res
目录,选择New > Image Asset
即可得到下图所示;可以根据自己的需要创建不同类型的图标
- 还可以通过该工具创建文本图标,只需要在
Asset Type
处选择Text
就可以了 - 至于在
xml
中引用图片就不多说了,这里提一下通过代码获得资源图片的引用
Resources res = getResources();
Drawable drawable = res.getDrawable(R.drawable.myimage);
- 或者在代码中设置图片资源
ImageView imageView = (ImageView) findViewById(R.id.myimageview);
imageView.setImageResource(R.drawable.myimage);
添加多密度矢量图Vector Asset Studio
- 使用矢量图(
SVG
)可以减小APK
的体积大小,因为同一张矢量图就可以转换为适配不同屏幕密度的图片,而且还不会失真,所以就避免了导入适配不同屏幕密度的bitmap
(Android 4.4 (API level 20)
及一下不支持矢量图) - 在代码中和
xml
文件中引用svg
资源的时候同普通的图片引用一样 - 该工具使用方法基本同上,也支持自己导入
SVG
,PSD
图片, - 可以使用在线矢量图编辑工具制作好矢量图后导入
改变资源文件的位置
- 一般而言资源文件的位置都在
module-name/src/source-set-name/res/
目录下,但是也可以在Module
级别的build.gradle
文件中更改资源文件位置,如下
android {
sourceSets {
main {
res.srcDirs = ['resources/main']
}
debug {
res.srcDirs = ['resources/debug']
}
}
}
- 如果想要使用多资源文件目录,也可以在同一个文件中进行配置;但是要注意的时在不同的资源文件目录中不要有相同的资源文件名
android {
sourceSets {
main {
res.srcDirs = ['res1', 'res2']
}
}
}
创建9.png图片
- 所谓的
9.png
图片就是一张可拉伸的位图,因而适应不同的内容 - 在一张需要制作的
png
图片右击,选择Create 9-patch file
,然后打开生成的对应的9.png
图片就可以进行编辑了,AndroidStudio3
中可以通过鼠标拖拉一层像蒙版形式的边界来绘制9.png
图片的可拉伸区域(其他版本没试过)
FireBase
- 这个是
Google
提供的一个免费的云端服务,需要翻墙才能使用,一般用于面向海外的APP
;详细信息可见官网
Lint(代码检查工具)
- 类似于静态代码检查工具,可以避免写测试代码而进行代码检查
- 具体用法参见博客
使用注解
-
Annotation
(注解)可以帮助检测更细微的代码问题,作为tag
添加到变量,参数,返回值中,来帮助检测传递的参数,返回值,局部变量和字段 - 注解示例
布局文件中的Tools属性
- 首先需要添加命名空间,在根节点添
xmlns:tools="http://schemas.android.com/tools"
- 这里指出几个比较重要的几个:
-
tools:context
:适用于任何根View
,用于指定默认的关联Context
;示例:
-
tools:listitem/tools:listheader/tools:listfooter
: 适用于AdapterView
或者其子类如ListView
,用于静态指定默认的Item
,需要注意的是RecyclerView
不是AdapterView
子类,所以无法使用咯;示例:
- 更多用例见文档
调试
- 网上教程比较多,参见博客
录制屏幕
-
Android Studio
也提供录制屏幕的工具,在手机或者模拟器上运行好APP
后,可以在Logcat
界面左边找到一个Screen Record
选项,点击之后;弹出一个对话框,直接点击Start Recording
即可进行录制(也可以进行简单设置,见下图;其中的Resolution
选项指的是设置录制视频的分辨率,默认为7280x720
);需要注意的是有时候在模拟器上运行时,Logcat
面板(Alt+6
可以打开)上录制屏幕的选项不可点击,可以换一个模拟器或者直接使用手机
- 还需要注意的最多录制三分钟
- 在
Logcat
面板左边还有一个Screen Capture
,用于截屏
adb(Android Debug Bridge)
- 在下载的
Android SDK
中可以找到,即platform_tools
中可以找到;adb
的作用有:运行设备的shell
,管理模拟器或设备的端口映射,计算机和设备之间上传/下载文件,将本地apk
软件安装至模拟器或android
设备 - 为了能够使用
adb
,需要使设备允许USB
调试
常用命令
-
adb devices -l
: 列出所有已连接设备;大致输出信息如下:其中,上面那个我通过USB
连接的手机,下一个是开启的模拟器;输出的格式为serial_number state
,serial_number
是adb
创建的标识设备的唯一标识符(如下CYEQO7SSLJN7DMLV
),state
表示的是设备的连接状态,有三种状态:offline
(实例未连接到adb
或不响应);device
(实例现在已连接到adb
服务器);no device
(未连接模拟器/设备)
需要注意的是,如果有多个设备连接到
adb
,那么使用adb
命令行发送命令的时候需要指定设备,即上面所说的唯一标识符,格式为:adb -s serial_number command
adb install path_to_apk
: 安装apk
文件adb pull remote local
与adb push local remote
:将设备上的文件拉取(pull
)和复制到(push
)到相应的目录(其中remote
表示连接的Android
设备目录,local
表示本地文件目录);如:adb push foo.txt /sdcard/foo.txt
使用
adb shell
进入shell
,之后可以使用shell
命令(见下文档)更多常用命令参见文档