android studio复制行怎么显示行数

Android Studio 1.0正式版初体验——常用功能使用指南_Linux教程_Linux公社-Linux系统门户网站
你好,游客
Android Studio 1.0正式版初体验——常用功能使用指南
来源:Linux社区&
作者:赵凯强
上一篇文章中(见 ),我们把 Studio的平台都搭建起来了,这一篇文章,将介绍Android Studio的一些常用的功能介绍。下面要介绍的功能是最常用的,但是肯定不全,如果你有什么其他的疑问,可以给我留言,解决之后我会告诉你。
1.如何导入Eclipse项目创建的项目
我们之前的项目基本都是Eclipse创建的,如果我现在想用Android Studio来管理,我们应该怎么做呢?
首先,在Eclipse中选择我们要转移的项目,然后选择File-export,选择下面的这一项,按照gradle的构建方式导出。
这样我们的Android Studio就能导入这个项目了。
首先打开AS,然后File ,import project,象下面这样
可以导入的项目的图标是不一样的,很贴心哈。
2.设置主题风格
正式版的AS有两种风格,白的黑色,黑色的炫酷,女生面前耍帅必备技能。
首先打开Preference,然后找到下面的选项,自己选一个主题就ok了
3.设置代码的字体
下面界面设置的是代码预览界面的字体设置,注意Scheme name,首先需要Save As,保存一个自己的名字,然后修改字体和大小即可。
4.设置系统界面的字体
如果我们要设置的是系统的字体,那么我们需要找到Appearance选项,然后选中Override defalut fonts by(not recommended),然后设置字体和大小即可
5.设置项目的文件和编码格式
统一编码对于编程的重要性,不言而喻啊!如果我们想设置项目的编码格式,首先,我们要有一个项目,然后选中项目,打开Preferances,分别设置IDE Encoding、Project Encoding、Default encoding 。推荐都设置为UTF-8。
6.快捷键设置
AS的快捷键很灵活,不仅有自己的一套快捷键系统,而且为了方便Eclipse的使用者,他还可以沿用Eclipse的快捷键习惯,这样我们都能很快的上手。
7.设置显示代码行数
在左侧的地方右键,选中Show Line Numbers即可
8.代码分析
Android Studio提供了强大的代码分析的功能,使用这个功能可以发现我们项目中的问题。选择Analyze菜单,然后选择Inspect Code
在下面的弹出框里面选则OK即可
下面是一个项目的分析结果
这里面就列出了很多的问题,我们可以根据这些提示优化我们的代码,非常强大!
12.04(64位)安装Android Studio 全过程 &
Android Studio v0.1尝鲜 &
Android Studio使用教程 &
Android Studio开发指南 &
Android Studio设置主题 和 不支持中文的问题解决方法 &
Android Studio 下载安装以及不能打开的解决办法 &
Android Studio安装使用图文教程 &
更多详情见请继续阅读下一页的精彩内容:
相关资讯 & & &
& (01月08日)
& (12/28/:15)
& (01月15日)
& (01月04日)
& (12/18/:14)
图片资讯 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款22029人阅读
Android Studio系列(59)
Android Studio在打开的文件左侧单击鼠标右键,也能像Eclipse一样设置显示代码行数,如图1。但是这边跟Eclipse有一个很大的区别,Eclipse设置后,其余的对应文件也跟着生效,即使文件关闭后重新打开行数也还是会显示,但是在Android Studio中这种设置只是针对本文件,而且也只是暂时的,文件关闭重新打开后行数又不显示了,感觉这功能很鸡肋啊。
那如何设置才能使行数永久显示呢,见图2。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1050096次
积分:6953
积分:6953
排名:第1712名
原创:68篇
评论:273条
文章:40篇
阅读:746413使用Eclipse可以方便的统计工程或文件的代码行数,方法如下:&1.点击要统计的项目或许文件夹,在菜单栏点击Search,然后点击File...&
2.选中正则表达式(Regular
expression),并在搜索文本框输入\n&3.在文件名中输入*或*.java&4.在范围里选中Enclosing
projects&5.在Search窗口就会显示出项目或文件的代码行数
阅读(...) 评论()无线开发一定少不了与服务端进行交互,这自然离不开使用类似于HttpClient的工具包来发送和接受HTTP请求。常用的有一些这些:
1. Apache 的 HttpClient(Android2.3之前使用)
2. Android 简化扩展版 HttpUrlConnection
3. Google 推出的 Volley(在Android2.3之前使用HttpClient,之后使用HttpUrlConnection)
4. Git开源项目Okhttp (使用http+SPDY协议)
5. Android-async-http
6. Retrofit(默认使用Okhttp作为传输层)
7. Android Query
8. Android AsyncTask
HttpClient 与 HttpUrlConnection对比:
对于HttpClient 大家都比较熟悉,这里就不做多余阐述,为什么使用HttpUrlConnection呢?主要原因是因为HttpClient虽然稳定,但是太庞大了,在Android上不易做升级和扩展,所以才有了轻量级的HttpUrlConnection。HttpUrlConnection相比与HttpClient做的扩展点可以参考下面的博客。
Volley中使用的也是HttpUrlConnection,那么Volley在HttpUrlConnection上有没有改进呢?还有待查阅相关资料。
Android自带的AsyncTask:不推荐使用。
1. 不支持环境改变;
2. 不能取消网络请求;
3. 没有简单的方法来做并发API调用;
4. 每个时刻只能有一个AsyncTask任务可以运行;
5. ancle()方法并不会起作用;
6. Activity被销毁,还保持Activity的引用时,可能导致内存泄露;
7. Activity reCreated时,可能导致AsyncTask的结果丢失;
8. 串行或并行的不确定性,依赖API Level的不同而不同;
AsyncTas阴暗的一面:
OkHttp、Volley、Retrofit三者对比:
Volley的特点:
1. Volley的优势在于处理小文件的http请求;
2. 在Volley中也是可以使用Okhttp作为传输层;参考:
3. Volley在处理高分辨率的图像压缩上有很好的支持;
4. NetworkImageView在GC的使用模式上更加保守,在请求清理上也更加积极,networkimageview仅仅依赖于强大的内存引用,并当一个新请求是来自ImageView或ImageView离开屏幕时 会清理掉所有的请求数据。
5. Volley比Retrofit在内存错误处理上要更好。
Retrofit的特点:
1. 使用REST API时非常方便;
2. 传输层默认就使用OkHttp;
3. 支持NIO;
4. 拥有出色的API文档和社区支持
5. 速度上比volley更快;
OkHttp的特点:
支持SPDY(请求头压缩、并行请求、强制SSL、服务端推送);
三者的性能基线:
其中Volley与Retrofit的对比,参考:
三者对比参考:
我们知道随着我们业务越来越负责,UI布局也会越来越复杂,大量的布局信息必定会带来一定的性能损耗,那么我们怎么才能写出高效的布局呢?
1. 使用 &include& &merge& &viewStub&标签。
2. LinearLayout中减少使用layout_weight参数,因为使用此属性会导致子元素被测量两次。
3. 学会测量Layout的层次结构,优化布局
4. 使得Layout宽而浅,而不是窄而深(在Hierarchy Viewer的Tree视图里面体现)
连接真机时,HierarchyVIewer报错了:无法加载设备上的窗口数据
原因:若需要使用hierarchyviewer,需要手机上开启对应的ViewServer服务。Hierarchy Viewer在连接手机时,手机上必须启动一个叫View Server的客户端与其进行socket通信。而在商业手机上,是无法开启View Server的,故Hierarchy Viewer是无法连接到普通的商业手机。
解决办法:
方法一:使用模拟器。
方法二:App中需要开启View Server,可以参考一下连个类的实现。
提取码:wrc8
使用方法:
引入ViewServer.java 类到Util包中,在需要查看Layout层次结构的Activity类中,
加入以下代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ViewServer.get(this).addWindow(this);
public void onDestroy() {
super.onDestroy();
ViewServer.get(this).removeWindow(this);
public void onResume() {
super.onResume();
ViewServer.get(this).setFocusedWindow(this);
5. 使用Lint工具来优化Layout
& 使用merge根框架 – 如果FramLayout仅仅是一个纯粹的(没有设置背景,间距等)布局根元素,我们可以使用merge标签来当作根标签;
& 无用的分支 – 如果一个layout并没有任何子组件,那么可以被移除,这样可以提高效率
& 无用的父控件 – 如果一个layout只有子控件,没有兄弟控件,并且不是一个ScrollView或者根节点,而且没有设置背景,那么我们可以移除这个父控件,直接把子控件提升为父控件
& 深层次的layout – 尽量减少内嵌的层级,考虑使用更多平级的组件 RelativeLayout or GridLayout来提升布局性能,默认最大的深度是10
Lint工具在android Studio中的使用:
Analyze → Inspect code 这个时候会自动启动Lint工具。
6. 虽然官方说LinearLayout 与 RelationLayout在性能上相差无几,但是能使用relative layout的地方尽量不要使用LinearLayout。
7. 有同事对比了RelationLayout 与 FrameLayout的性能,发现FrameLayout性能比RelationLayout更优。原因很简单:因为FrameLayout比RelationLayout更简单,没有那么多属性,所有效率更高。无论是使用那种布局,在都能满足需求的情况下,只要记住,使用属性跟少、更简单的布局方式一定是没错的。
8. 对于textview和imageview组成的layout,直接使用textview替换(drawableTop类似属性)
ListView显示的三要素:
ListView,用来展示列表
Adapter,用来存在数据&将数据与视图进行绑定
数据,将被映射的字符串、图片url等等。
关于Adapter ,请参考 Android 之 Adapter。
ListView 的工作原理:
Adapter的作用就是ListView界面与数据交互的桥梁,当列表里面每一项显示到页面上时,都会调用Adapter的getView方法。
系统需要回执ListView时,首先会调用getCount()函数,得到要绘制的这个列表额长度,然后开始从第一行开始绘制,每行的回执方法是调用getView函数。那么Android是不是为每一行都会新创建一个View呢?试想加入行数为几万行,内存肯定会爆掉的,所以Android官方早就想到了这一点,在ListView实现中添加了视图的缓存-Recycler,每当有行移除屏幕的可视区域时,这个被移除的行的View对象就会被添加到Recycler中,也就是在渲染新行时的那个参数convertView。
ListView的初始化:
疑问一:ListView绘制时是如何获取每行的View的呢?
首先ListView通过setAdapter方法,将Adapter与ListView关联起来,查看ListView的setAdater方法源码可知,setAdater将传递经来的Adapter的引用复制给了内部全局变量mAdapter,ListView在绘制每行的时候根据行号position调用父类AbsListView中的obtainView,obtainView首先会从recycler中获取是否有匹配的视图,如果存在的话,可以看到则调用adapter.getView方法,并传递了scrapView给convertView变量,否则传递的是null。
疑问二:ListView中数据发生变更了,我们一般会调用Adapter的 notifyDataSetChanged()方法, 那么视图是怎么发生变化的呢?
ListView 中的数据适配器Adapter 采用的是观察者模式(参考之前的”观察者模式“)
ListView在setAdapter时,会新建ApdateDataSetObserver,并注册此观察者。
AdapterDataSetObserver类实在AbsListView中定义:
AdapterView中AdapterDataSetObserver的实现如下(部分省略):
AdapterDataSetObserver 实现了DataSetObserver接口,并重写了onChanger方法,里面调用了requestLayout方法,此方法的作用是要求parent view 重新调用它的哦弄Measure onLayout方法重新布局视图,但不会重新绘制任何视图包括该调用者本身。
requestLayout的实现方法需要到View类中查看:可参考:
疑问三:RecyclerBin的数据结构是这样的呢?当ListView有多个视图类型(在界面上就是有不同的样式和数据类型)又是怎么选择合适的convertView的呢?
首先看一下RecycleBin的类定义(AbsListView中内部类)
从注释中我们就可以得知 :
RecycleBin一共有两个存储结构分别是ActiveViews 和 ScrapViews
ActiveViews储存当前在界面(手机显示区域)中显示View,移出界面会存入ScrapViews
ScrapViews存储当前已经滑动出当前界面(手机显示区域)显示的View,这些view存储起来相当于回收,当再次请求的时候从此存储中取出反复使用。
当ListView中有N个视图类型时,RecycleBin会创建N个scrapView数组,每个类型一个view数组,后面在获取view时会先判断view的类型,然后到对应的数组中去取。
怎么从ScrapViews中获取可用的view视图呢?getScrapView
→ retrieveFromScrap
retrieveFromScrap(这个不属于RecycleBin类,是属于外部类AbslistView中的方法)
根据position,从mScrapView中找:
1. 如果有view.scrappedFromPosition = position的,直接返回该view;
2. 否则返回mScrapView中最后一个;
3. 如果缓存中没有view,则返回null;
下面,我们来分析下这三种情况在什么条件下满足?
a. 第三种情况,这个最简单:
一开始,listview稳定后,显示N个,此时mScrapView中是没有缓存view的,当我们向上滚动一小段距离(第一个此时仍显示部分),新的view将会显示,此时listview会调用Adapter.getView,但是缓存中没有,因此convertView是null,所以,我们得分配一块内存来创建新的convertView;
b. 第二种情况:
在a中,我们继续向上滚动,直接第一个view完全移出屏幕(假设没有新的item),此时,第一个view就会被detach,并被加入到mScrapView中;然后,我们还继续向上滚动,直接后面又将要显示新的item view时,此时,系统会从mScrapView中找position对应的View,显然,是找不到的,则将从mScrapView中,取最后一个缓存的view传递给convertView;
c. 第一种情况:
紧接着在b中(标示为橙色的文字后面),第一个被完全移出,加入到mScrapView中,且没有新增的item到listview中,此时,缓存中就只有第一个view;然后,我此时向下滑动,则之前的第一个item,将被显示出来,此时,从缓存中查找position对应的view有没有,当然,肯定是找到了,就直接返回了。
ListView使用过程中遇到的问题:
① Listview 滑动中背景错乱:
场景:我有一个listView作为菜单,当菜单选中时有一个指示器会展示出来,其他的会被隐藏,默认第一个菜单为选中状态,但是当滑动listview时,新加在出来的item中指示器也展示出来了。
原因:理解了上面的getView和RecycleBin的工作原理之后,这个问题不难定位,肯定是在渲染新行时从scropViews中没有匹配position位置的view,此时默认返回了最后一个view(也就是场景中对应的第一个),这个view是被我们设置了指示器为可见状态,所以就引起了背景的错乱。
解决办法:
对于positon等于我们选择的下标时会指示器可见,当position不等于我们选择的下标时,防止convert被复用,我们需要设置指示器为不可见,也就是else中的代码,之前我只写了if中的代码,却忽略了else中的代码。
这个问题也可以参考:
Gradle的简介,这里就不罗嗦了,Google上一大堆,这里就说说它的基本使用吧(可以简单的理解为它是Maven的高级版本,没那么神秘)。
基本使用流程:
1. 下载 Gradle 到本地,并配置环境变量。
2. 在项目中创建 build.gradle文件
3. 编写 build.grade 脚本
4. 执行grade 命令
快捷使用方法:
下载Android Studio,让它帮我们搞定一切。
指定依赖:
1. 依赖仓库中的jar
compile 'group:name:version'
2. 依赖本地jar文件夹
compile fileTree(dir, 'libs' ,include : '*.jar')
3. 依赖本地单个jar文件
compile file('libs/xxx')
3. 依赖工程
compile project(:xx:xx)
4. Android library依赖
需要把库的build.gradle文件中apply plugin: ‘android’ 改为 apply plugin: ‘android-library’ ,否则会报以下错误:
仓库配置:
1. 从中央仓库下载:mavenCentral()
2. 使用本地Maven仓库:maven {
url “file://F:/githubrepo/releases”
3. 指定远程仓库:maven{url “https://xxx”}
多项目管理
1. 加入我们的项目结构如下:
MyProject/
+ libraries/
2. 外层根配置setting.gradle ,引入各个项目
include ‘:app’, ’:libraries:lib1′, ’:libraries:lib2′
3. 每个项目会包含一个build.gradle文件声明该项目的编译过程
MyProject/
| settings.gradle
| build.gradle
+ libraries/
| build.gradle
| build.gradle
4. 随后我们需要在:app这个项目中指名所依赖的项目
dependencies {
compile project(‘:libraries:lib1′)
compile project(‘:libraries:lib2′)
Android 项目的Gradle编译:
我们通常会在build.gradle中配置 依赖的gradle的版本、android编译版本、android构建工具版本,这三者配置的跟本地存在的有不一致就会导致gradle build失败。
1. gradle版本依赖配置如下:
classpath ‘com.android.tools.build:gradle:0.12.+’
我们需要查看我们本地安装的gradle的版本是否大于等于此版本号。(Android Studio推荐使用0.12+,所以推荐使用Android Studio,它会帮助我们下载响应版本的Android Studio)
2. android编译版本
compileSdkVersion 19
确保本地SDK中已近下载了相应版本的SDK API
3. android构建工具版本
buildToolsVersion “19.1.0″
对于android编译版本,同样推荐使用Android Studio,我们通过Gradle编译,如果版本不匹配,它会提示无此版本工具,并提示下载,当然你也可以到SDK中手工下载(不推荐)。
Android studio 中 使用 gradle 加载本地 .so 库:
方法一:添加自定义任务:
task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') {
destinationDir file("$buildDir/native-libs")
baseName 'native-libs'
extension 'jar'
from fileTree(dir: 'libs', include: '**/*.so')
into 'lib/'
tasks.withType(Compile) {
compileTask -& compileTask.dependsOn(nativeLibsToJar)
上面的意思是,在编译的过程中加入nativeLibsToJar任务,这个任务先在构建目录中新建了一个native-libs的文件夹,然后进行重命名为native-libs.jar,将so文件都加入到jar文件中。
方法二:手动生成.Jar文件后自动解包到apk文件
这个方式需要自己手动进行.SO文件压缩,具体步骤为:将所有需要使用的.so文件压缩为.zip文件(zip中的文件目录结构为: lib/armeabi/*.so)然后把zip文件后缀改为.Jar然后放到libs生成apk就ok
方法三:Gradle官方在新版已经自动实现了打包.SO文件
在sourceSets -& main 中加入一下代码:
jniLibs.srcDirs = ['libs']
这样就不需要手动拷贝了。我的项目是多工程依赖,android-library工程中含有so文件,采用方法一,打出的App包中无法加载so文件,哭呀,由于项目才用了黑匣子,这个问题排查了好几天,shite,所以推荐Android项目加载so文件都使用jni的方式。
参考:http://blog.csdn.net/qiujuer/article/details/
在dependencies 中加入编译后的jar包:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
使用Gradle 对android lib进行打包,打出可依赖的jar:
android.libraryVariants.all { variant -&
def name = variant.buildType.name
def task = project.tasks.create "jar${name.capitalize()}", Jar
task.dependsOn variant.javaCompile
task.from variant.javaCompile.destinationDir
task.pile.findAll {
it.getName() != 'android.jar' && !it.getName().startsWith('junit') && !it.getName().startsWith('hamcrest')
}.collect {
it.isDirectory() ? it : zipTree(it)
artifacts.add('archives', task);
生成的lib文件夹有时候可能在Android Studio中看不到,所以建议采用打问文件目录的方式产看生成的jar文件。
很多时候我们期望判断上一个Activity的来源,如果不符合预期,我们则期望跳转到指定的Activity中,那这样的乖哦给功能如何实现呢?
解决方案如下:
每个Activity跳转过程中加入变量,类似:
传递本Activity的名称给下一个Activity,为了方便可以把所有Activity名称定义为String常量,注意通过R查找的资源为id而不是字符串。
判断上一个Activity的来源
跳转到期望的Activity,但是调用栈中两个Activity之间可能存在多个其他Activity,如何跨过去呢?设置如下参数:
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
忽略目标Activity上面的所有Activity,否则会出现多次闪屏的情况。}

我要回帖

更多关于 android studio复制行 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信