[置顶] Android开发笔记(成长轨迹)

分类: 开发学习笔记

 

1.控制台输出:called unimplemented OpenGL ES API

调用了未实现的OpenGL ES API函数,一般由于导入的第三方库如地图库,里面有用到OpenGL,但是模拟器的硬件默认是没有这个的,所以需要我们编辑模拟器Emulation Options选项勾选 Use Host GPU 然后重启模拟器再尝试,如果还是这个错误,那么我们只好用真机测试了。

 

2.控制台输出:

这个错误是由于真机里已经存在一个相同签名的应用程序,最简单是真机先卸载掉,然后再run。

 

3.高德地图android版本,导入地图库,项目打开后报错:

06-05 09:10:46.718: W/dalvikvm(932): Unable to resolve superclass of Lcom/amapv2/cn/apis/BasicMapActivity; (29)
06-05 09:10:46.718: W/dalvikvm(932): Link of class 'Lcom/amapv2/cn/apis/BasicMapActivity;' failed

06-05 09:10:46.888: E/AndroidRuntime(932): FATAL EXCEPTION: main
06-05 09:10:46.888: E/AndroidRuntime(932): java.lang.ExceptionInInitializerError
06-05 09:10:46.888: E/AndroidRuntime(932):         at java.lang.Class.newInstanceImpl(Native Method)
06-05 09:10:46.888: E/AndroidRuntime(932):         at java.lang.Class.newInstance(Class.java:1319)
06-05 09:10:46.888: E/AndroidRuntime(932):         at android.app.Instrumentation.newActivity(Instrumentation.java:1054)

 

这个错误是由于你的android开发环境adt升级到最新版本导致的错误,属于你Android开发环境问题,选中你的项目,右击选择“Properties”---------》“Java Build  Path”--------》“Order  and  Export” ,把“Android  Private Libraries”选项打上勾,再次编译就可以了。

 

4.android横竖屏锁定:

xml文件中设置:
  要实现这个目的,只需要在AndroidManifest.xml里声明Activity的时候加上一个属性:android:screenOrientation,属性取值landscape为固定横屏、portrait为固定纵屏幕。
  代码:
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE););//强制为横屏
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏
  ============延伸========
  屏幕会自动切换时,默认状态的应用程序,会重新调用onCreate,相当于重新启动了一次应用程序。同时,layout可能因为横屏带来不能合理适配的问题。为了解决旋屏和键盘切换引起的程序重启问题,还需要增加一个属性:android:configChanges。这个属性可以理解为一个监听器,它将拦截旋屏和键盘切换事件,阻止程序重启而变为回调onConfigurationChanged方法。这里常用的属性取值为:keyboardHidden|orientation。

 

Socket TCP/UDP通信原理http://wenku.baidu.com/view/47437d4dcf84b9d528ea7a67.html

 

 

5,android 谷歌地图开发时,控制台输出:

[置顶] Android开发笔记(成长轨迹)_第1张图片

也就是调试时真机运行后地图显示空白。造成这种现状的原因是由于 google api key配置错误。

Api key分为两种情况

一种是使用debug keystore生成的api key

一种是使用release keystore生成的api key

不同的api key使用不同的sha1字符生成 ,所以如果是调试,如果使用android自带的debug keystore,一定要是当时生成debug api key的那个 keystone。如果是release,自己的keystore来签名,APP配置文件就用 release下生成的api key。不能混用。否则显示不了地图。

解决办法:

1,把debug keystone替换成生成 api key 的那个:

[置顶] Android开发笔记(成长轨迹)_第2张图片,

2,APP配置文件里要启用debug 的 key:

 

6,Android Your content must have a ListView whose id attribute is 'android.R.id.list'错误

 

错误提示:Your content must have a ListView whose id attribute is 'android.R.id.list'

对于以上错误,其实可能是因为我们要实现对ListView中setOnItemClick的事件监听而去继承了LiseActivity,但是却没有ListView的标签,网上有说过只要在布局文件中添加如下代码即可:

[java]  view plain copy 在CODE上查看代码片
 
  1. <ListView     
  2. android:id="@android:id/list" 或android:id="@id/android:list"    
  3. android:layout_width="fill_parent"    
  4. android:layout_height="wrap_content">    
  5. </ListView>    

7,view的onFinishInflate()何时调用的?

 

比如:自定义一个view叫myView ,路径是,com.test.view.MyView,此view是继承LinearLayout,定义的布局文件是my_view.xml
里面内容是:
<com.test.view.MyView>
        <xxxx />
</com.test.view.MyView>

当在使用的时候,可以这样使用
MyView mv = (MyView)View.inflate (context,R.layout.my_view,null);
当加载完成xml后,就会执行那个方法。
 
8,onInterceptTouchEvent与onTouchEvent 执行顺序

 

 

ViewGroup里的onInterceptTouchEvent默认值是false这样才能把事件传给View里的onTouchEvent.

 

ViewGroup里的onTouchEvent默认值是false。

 

View里的onTouchEvent返回默认值是true.这样才能执行多次touch事件。

http://blog.csdn.net/android_tutor/article/details/7193090

 

9,Jar mismatch! Fix your dependencies

[置顶] Android开发笔记(成长轨迹)_第3张图片

这个问题是我们添加了多个开源应用例如ABS 或者 PageIndicator 由于他们都包含 support V4.jar, 或者你的工程目录里 libs 中包含这个包,所以冲突发生了,他们各自的签名SHA 不一致,解决方案:

去掉某一个libs里面的supportv4.jar,直接在引用  external jar using build path menu > add external jar,在目录外选一个(supportV4.jar)即可。

 

10,明明卸载掉了豌豆荚,可是.apk文件还是显示 wandoujia.file,如何去除?

开始=运行=输入CMD回车 输入assoc .apk=null (记得assoc后面有个空格和点) 回车即可。

[置顶] Android开发笔记(成长轨迹)_第4张图片

 

11,gen already exists but is not a source folder. Convert to a source folder or rename it.

[置顶] Android开发笔记(成长轨迹)_第5张图片

解决办法:

[置顶] Android开发笔记(成长轨迹)_第6张图片

[置顶] Android开发笔记(成长轨迹)_第7张图片

   1. Right click on the project and go to "Properties" //鼠标右键点击项目,然后选中Properties
   2. Select "Java Build Path" on the left //选择java Build Path
   3. Open "Source" tab // 打开源文件的tab栏
   4. Click "Add Folder..." //点击添加文件夹
   5. Check "gen" folder and click Ok and Ok again //选中gen目录 然后点确定  应该就可以了【保证source下是gen和src,缺少哪个就添加哪个,缺一不可多余的全部删除】

 

[置顶] Android开发笔记(成长轨迹)_第8张图片
   6. Again right click on the project and in the "Andriod Tools" click on "Fix Project Properties"  //右键点击项目 选择     Andriod Tools 点击 Fix Project Properties

 

按照以上做法,虽然library项目不报错了,可是在其它的项目中引用不到library的类,并且library项目本身都无法引用到,如下:

[置顶] Android开发笔记(成长轨迹)_第9张图片

 

[置顶] Android开发笔记(成长轨迹)_第10张图片

解决办法:

右键项目,build path ----->config build path 在SourceTab栏,addFolder:这一回添加src

[置顶] Android开发笔记(成长轨迹)_第11张图片

在看看项目组织:

[置顶] Android开发笔记(成长轨迹)_第12张图片

没问题了吧。

 

12,获取当前设备屏幕宽度和高度

 

[java]  view plain copy 在CODE上查看代码片
 
  1. Display display = getWindowManager().getDefaultDisplay();  
  2. display.getWidth();  
[java]  view plain copy 在CODE上查看代码片
 
  1. <span style="white-space:pre">        </span>display.getHeight();  

13,项目工程下的lint.xml什么作用?

[置顶] Android开发笔记(成长轨迹)_第13张图片

代码性能改进工具,Lint会自动扫描现有工程的Java和xml文件,给出性能优化改进建议,最终将会在Android的工程目录下生成lint.xml文件。简单点说就是检查项目里不推荐的代码文件。

 

14,无论真机还是模拟器运行项目,总是闪退,后台报错Class找不到:

[置顶] Android开发笔记(成长轨迹)_第14张图片

 

解决:找半天,clean好多次,都解决不了,一开始以为少了相关的库文件或路径不对,后来才发现,只要把R文件里的所有包下的文件全部remove掉,让系统自动重新生成,就可以拉。

 

15,ClassNotFoundException: Didn't find class "org.osmdroid.views.MapView" on path: /data/app/net.yu-2.apk

[置顶] Android开发笔记(成长轨迹)_第15张图片

这个错误是指apk打包时发现:org.osmdroid.views.MapView找不到,但是我们在代码里,引用此路径,就能找到MapView,后来终于想到:

[置顶] Android开发笔记(成长轨迹)_第16张图片这个jar包在Android private Libraries里

build config里应该勾选这个,否则打包时不会添加android Private Libraries里的库

[置顶] Android开发笔记(成长轨迹)_第17张图片

 

16,基于XMPP的android连接openfile服务时出错:SASL authentication DIGEST-MD5 failed 

[置顶] Android开发笔记(成长轨迹)_第18张图片

 

出现这个问题是由于客户端连接openfile时SASL验证出错,网上找了些相关资料,说是关闭相关鉴权验证就可以了:

 

[java]  view plain copy 在CODE上查看代码片
 
  1. config.setTLSEnabled(false);  
  2. config.setCompressionEnabled(false);  
  3. config.setSelfSignedCertificateEnabled(false);  
  4. config.setSASLAuthenticationEnabled(false);  
  5. config.setVerifyChainEnabled(false);  
可是设置后,还会出现这些错误,终于找到原因,是因为连接服务器时,username和password出错了,看log日志发现我的password传递的为null,所以造成了SASL验证出错。确保你的username和password都有正确的值(和服务器的key对应)就可以了。

 

[置顶] Android开发笔记(成长轨迹)_第19张图片

参考文章:

http://blog.sina.com.cn/s/blog_7e3fa7ec0101894b.html 基于XMPP协议的Android IM研究 

http://blog.csdn.net/onelight1997/article/details/6301289 gloox 链接openfire服务器问题解决办法

http://www.oschina.net/question/872914_80498

 

 

17,使用HttpClient时:Target host must not be null, or set in parameters

出现这个问题,原因是url,连接地址不完整, 必须加上"http://"

 

[java]  view plain copy 在CODE上查看代码片
 
  1. HttpPost post = new HttpPost("http://gps.google.com/geo");  

 

18,真机调试时错误:INSTALL_FAILED_INSUFFICIENT_STORAGE

出现这个问题,原因是设备(真机或模拟器)的内容空间不足,APP无法安装,如过用的手机,删除一些没用的软件腾出一些空间来,如用的是模拟器,设置device的内存更大一些。

 

 

19,如何把工程项目下的文件归档?(use as Source Folder)

[置顶] Android开发笔记(成长轨迹)_第20张图片

(我们有时候看项目下会有上图中的文件夹打开后都是一层包一层(树状)的并不像com.ka.tradk这样,原因在于当前的包不是Source Folder)

添加完后感觉特别混乱,还是有错误,就看本文第11个截图的解决办法,右键点击工程,选择 "Properties",选择左边的 "Java Build Path",打开 "Source" 标签面板,点击 "Add Folder...",删除没用的,勾选 "gen和src" 文件夹,点击OK,点击YES,再点击OK。

 

20,在java中,如何四舍五入保留小数点x位?

方法一:

 

[java]  view plain copy 在CODE上查看代码片
 
  1. float temp = 0.6922224f;  
  2. BigDecimal bd = new BigDecimal(temp);  
  3. bd =bd.round(new MathContext(2));  
结果:

 

System.out.println("bd:"+bd);               bd =  0.69 

显然MathContext中的参数就是保留几位小数点,这种方法返回的是对应类型(float)的结果,如上bd

方法二:

 

[java]  view plain copy 在CODE上查看代码片
 
  1. String parten = "#.#";  
  2. DecimalFormat decimal = new DecimalFormat(parten);  
  3. String str= decimal.format(temp);  
  4. interval = Float.valueOf(str);  

结果:

 

System.out.println(interval);    interval = 0.7

显然这种方法关键的就是parten参数, #.##就是保留两位小数点并且四舍五入,这种方法返回的是字符串类型。

 

21,使用eclipse打包时:Export aborted because fatal lint errors were found

[置顶] Android开发笔记(成长轨迹)_第21张图片

解决办法:

1,点中项目右键  Properties

2,左边Android列表打开 Android Lint Preference,如下图:

[置顶] Android开发笔记(成长轨迹)_第22张图片

3,在上图右上角,点击文字超链接,Configure workspace settings,如下图:

[置顶] Android开发笔记(成长轨迹)_第23张图片

4,将"Run full error check when exporting app and abort if fatal errors are found "前的勾去掉,点击Apply再点击OK,全部保存。

5,再次选中项目,鼠标右键,AndroidTools-> Clean Lint Markers。稍等片刻,等待APP清除并重新生成Lint.xml文件。

这个时候再打包,就不会再有错误了。

 

22,listview如何自定义或不显示分割线?

1,ListView中每个Item项之间都有分割线,设置android:footerDividersEnabled表示是否显示分割线,此属性默认为true。

 

[html]  view plain copy 在CODE上查看代码片
 
  1. <ListView  
  2.     android:id="@+id/local_groups_list"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:footerDividersEnabled="false" />  
或是在代码中mListView.setFooterDividersEnabled(false);

 

2,改变ListView的分割线颜色和宽度,需要在布局中定义android:divider和android:dividerHeight属性。

[html]  view plain copy 在CODE上查看代码片
 
  1. <ListView  
  2.     android:id="@+id/local_groups_list"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:divider="@color/divider_color"  
  6.     android:dividerHeight="1px" />  
setDivider方法就可以设置自己想要的分割线样式,可以是color也可以是Drawable

 

3,也可以设置listview不显示分割线,然后给每一个listview item 的底部添加一个imageview,来充作分割线,这也是一种方法。

 

23,android:inputType="numberSigned"和代码EditText中setInputType以及setRawInputType区别

android中inputType属性在EditText输入值时启动的虚拟键盘的风格有着重要作用。这也大大的方便的操作。有时需要虚拟键盘只为字符或只为数字。所以inputType尤为重要。

    android:inputType="none"
    android:inputType="text"
    android:inputType="textCapCharacters"
    android:inputType="textCapWords"
    android:inputType="textCapSentences"
    android:inputType="textAutoCorrect"
    android:inputType="textAutoComplete"
    android:inputType="textMultiLine"
    android:inputType="textImeMultiLine"
    android:inputType="textNoSuggestions"
    android:inputType="textUri"
    android:inputType="textEmailAddress"
    android:inputType="textEmailSubject"
    android:inputType="textShortMessage"
    android:inputType="textLongMessage"
    android:inputType="textPersonName"
    android:inputType="textPostalAddress"
    android:inputType="textPassword"
    android:inputType="textVisiblePassword"
    android:inputType="textWebEditText"
    android:inputType="textFilter"
    android:inputType="textPhonetic"
//数值类型
    android:inputType="number"
    android:inputType="numberSigned"
    android:inputType="numberDecimal"
    android:inputType="phone"//拨号键盘
    android:inputType="datetime"
    android:inputType="date"//日期键盘
    android:inputType="time"//时间键盘

在代码中设置的方法:setInputType和setRawInputType的区别,前者是以TEXT类型的键盘,后者是单独Number类型的键盘:

 

[置顶] Android开发笔记(成长轨迹)_第24张图片 [置顶] Android开发笔记(成长轨迹)_第25张图片
 
fuelcity和fuelhighway都是EditText
[java]  view plain copy 在CODE上查看代码片
 
  1. fuelCity.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);  
  2. fuelHighway.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);  
 
[java]  view plain copy 在CODE上查看代码片
 
  1. fuelCity.setRawInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_SIGNED);  
  2. hway.setRawInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_SIGNED);  

注意,参数必须要有InputType.TYPE_CLASS_NUMBER,否则会显示全键盘。

 

24,从SD卡获取一个png,然后转化为Bitmap或是Imageview

 

[java]  view plain copy 在CODE上查看代码片
 
  1. String path = Environment.getExternalStorageDirectory().toString()  
  2.         + "/test.png";  
  3. Bitmap mSharedPic = BitmapFactory.decodeFile(path);  
转化为Imageview

 

 

[java]  view plain copy 在CODE上查看代码片
 
  1. ImageView iv = (ImageView) findViewById(R.id.image_test);   
[java]  view plain copy 在CODE上查看代码片
 
  1. iv.setImageBitmap(<span style="font-family:Helvetica,Tahoma,Arial,sans-serif">mSharedPic </span><span style="font-family:Helvetica,Tahoma,Arial,sans-serif">);</span>  

25 Android string.xml通配符(%$)和转义字符的用法

 

 

StringFormat通配符 

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>

在这个例子中,这个格式化的字符串有2个参数

属性值举例说明
%n$ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格 
%n$md:代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m个0 
%n$mf:代表输出的是浮点数,n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00

 

在程序中按照下面的方法来根据参数来格式化字符串:

Resources res = getResources();

String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);

 

[html]  view plain copy 在CODE上查看代码片
 
  1. <string name="info_address">Address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$md)</string>  
  2. <string name="info_address_english">Address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$.1ft)</string>  
  3. <string name="info_address_a">Approximate address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$.1fm)</string>  
  4. <string name="info_address_ab">Approximate address: %1$s(%2$s %3$.3f°,%4$s %5$.3f°,Altitude %6$.1ft)</string>  


 

 

XML转义字符 
以下为XML标志符的数字和字符串转义符 
"     (&#34; 或 &quot;) 
'     (&#39; 或 &apos;) 
&     (&#38; 或 &amp;) 
lt(<) (&#60; 或 &lt;) 
gt(>) (&#62; 或 &gt;) 

比如:在string.xml中定义如下一个字符串, 
<string name="first">大家好,欢迎来到mryang社区。welcome to here!</string> 
我想以 
大家好,欢迎来到eoeandroid社区。 
welcome to here! 
两行的形式输出,如何做?加\n,看下面: 
<string name="hello">大家好,欢迎来到mryang社区。\nwelcome to here!</string> 

android中的空格编码 string.xml前后加空格的技巧 
<string name="space">&#160;&#160;&#160;&#160;我来看空格</string> 
&#160; 这个就代表着空格 

1. 遇到如下错误的时候说明你需要在单引号签名加转义字符(\): 
Description Resource Path Location Type error: Apostrophe not preceded by \ (in Search' Titles) strings.xml 
只要将定义的字符串中的单引号('), 修改为(\')即可 

2. 变量文本格式(%s)提示: 
Multiple annotations found at this line: 
- error: Multiple substitutions specified in non-positional format; did you mean to add the formatted="false" 
attribute? 
- error: Unexpected end tag string 
这是由于新的SDK采用了新版本的aapt(Android项目编译器), 这个版本的aapt编译起来会比老版本更加的严格, 在Android最新的开发文档中描述String的部分,已经说明了如何去设置 %s 等符号, 可以点击去看. 
简单解决方法就是:把%s之类的变量格式替换成%1$s, %1表示第一个位置的变量, $s表示为字符串类型 
例如: 
<string name="welcome_messages">Your First Var is %1$s! You Second Var is %2$d.</string> 

 

26,如何导入第三方library库?

导入的前提是lib已经被添加到了当前workspace里面,这样的话就可以使用相对路径了。

 

方法一:

直接在project.properties里添加:

 

[java]  view plain copy 在CODE上查看代码片
 
  1. target=android-17  
  2. android.library.reference.1=..\\LibSlidingMenu2  

 

 

方法二:

手动导入:

[置顶] Android开发笔记(成长轨迹)_第26张图片

导入完成后:

[置顶] Android开发笔记(成长轨迹)_第27张图片

方法二的和一的区别在于路径引用上,如上图,1,2是方法一来引用的;3,4是方法二引用的。

 

27,R cannot be resolved to a variable

遇到这种情况可以看一下RES里是否有错误,如果有错误,必然导致R无法成功生成,所以先解决所有资源文件的错误。

1. 检查Android 的SDK是否丢失需要重新下载,检查build path
2. 确保class没有import Android.R;
3, 错误class引用的layout的xml文件没有错误
4. 检查AndroidManifest.xml文件,里边的package,layout配置文件,strings.xml等的字符串全部书写正确
5. layout的xml文件中引用的strings.xml中的字符串拼写完全正确
6. 在layout 的xml文件手写添加一个控件,看id能否在R.java中自动生成,如果不能,那很大可能就是这个layout 的xml文件有问题,查看格式是否使用正确,或者包含什么非法字符串,或者调用到了不正确的字符串,等等,可以使用排除法,挨个去掉控件,直到发现error message消失或者id能在R.java中自动生成。
7. 删掉gen文件夹,使R.java重新自动生成一次,如果不能生成,继续检查layout的xml文件是否有如上不易发觉的问题
8. Clean project ,重新build,或者重新import project。
9. 重启eclipse。

 

28,当import一个新的android项目时,项目名称上出现一个红色的感叹号,程序不能运行

右键项目---BuildPath---Configure Build Path, 切换libraries标签页,你应该会看到Android Dependencies里红色的X号,也就是说某一个jar包现在不可用了,查看一下是否jar包路径有变化,修复了就没问题了。

还有在我们引用第三方jar包或是自己写的support支持库时,一定记得要在project.properties里添加: android.library=true  否则,其它项目引用此库时,是无法生产库名.jar包名的。

以下为引用:

        你用myeclipse新建 web工程, 在工程目录下会生成一个 .classpath 配置文件, 里面是你工程里面引用的jar的配置。这个.classpath 对你的web工程没有什么影响 
其实是给 myeclipse 识别的。 你说的这种情况是因为 .classpath 文件里面配置引用了某个jar,但是实际上你的 lib 里面并没有这个jar 所以才会有红色的提示。 
        你不用拿.classpath文件和你的jar一个个去找, 你现在打开MyEclipse 右键单击你的web工程,找到 Build Path > Configure Build Paht... > 然后上面有几个选项卡找到 Libraries。  这里看到的就是你工程里面引用的 所有的 jar , 看看是不是在某个jar图标上有个很小的黄色的感叹号? 
         如果有的话就没错了, 先选中这个jar, 点击右边的 Remove  > 点击OK 等待几秒, 现在web工程上面的红色XX是不是没有了,哈哈。 解释一下: 黄色的感叹号的jar,表示.classpath配置文件引用了jar, 但是实际上lib里面没有这个jar。

 

29,如何实现屏幕截图(Mapview)

直接附上实现代码,截取当前屏幕,并保存到手机内。

 

[java]  view plain copy 在CODE上查看代码片
 
  1. public Bitmap takeScreenShot(){  
  2.     View view = this.getWindow().getDecorView();  
  3.     view.setDrawingCacheEnabled(true);  
  4.     view.buildDrawingCache();  
  5.     Bitmap bt = view.getDrawingCache();  
  6.       
  7.     Rect frame = new Rect();  
  8.     view.getWindowVisibleDisplayFrame(frame);  
  9.     int statusHeight = frame.top;  
  10.       
  11.     int width = this.getWindowManager().getDefaultDisplay().getWidth();  
  12.     int height = this.getWindowManager().getDefaultDisplay().getHeight();  
  13.       
  14.     Bitmap create = Bitmap.createBitmap(bt, 0,statusHeight,width,height-statusHeight);  
  15.     mMapView.destroyDrawingCache();  
  16.       
  17.     return create;  
  18. }  
  19.   
  20. public void saveScreenShot(Bitmap bitmap,String filepath){  
  21.       
  22.     FileOutputStream fos = null;  
  23.       
  24.     try {  
  25.         fos = new FileOutputStream(filepath);  
  26.           
  27.         if (null!=fos) {  
  28.             bitmap.compress(CompressFormat.PNG, 90, fos);  
  29.             fos.flush();  
  30.             fos.close();  
  31.             System.out.println("succccesss");  
  32.         }  
  33.           
  34.           
  35.     } catch (FileNotFoundException e) {  
  36.         e.printStackTrace();  
  37.     } catch (IOException e) {  
  38.         // TODO Auto-generated catch block  
  39.         e.printStackTrace();  
  40.     }  
  41.       
  42.       
  43. }  

实现:

 

[java]  view plain copy 在CODE上查看代码片
 
  1. Bitmap bitmap = takeScreenShot();  
  2. saveScreenShot(bitmap, Constants.defaultScreenPath);  


 

30,android-support-v4.jar混乱冲突

[置顶] Android开发笔记(成长轨迹)_第28张图片

这是由于不同的library同时引用了android-support-v4.jar,但是他们不是同一个文件,SHA-1不相同,系统只允许libraries must be the same,所以我们删除那个不相同的jar包,把其余的使用同一个的jar拷贝到library里就可以了。

 

31,eclipse中git插件的cannot open git-upload-pack问题

[置顶] Android开发笔记(成长轨迹)_第29张图片

我们在eclipse上使用插件egit向代码服务器push或pull代码时,有时候会发现出现cannot open git-upload-pack这个问题。一般引起这个问题的原因有两个:

一、网络问题,确定你可以访问自己所要操作的代码仓库地址!【这是最关键的,我就是折腾半天发现公司关闭了地址的外网访问】。

二、eclipse中git插件的配置问题。

打开eclipse中的windows-->Preferences-->Team-->Git-->Configuration-->User Settings.然后点Add Entry新建一个键值对,输入http.sslVerify=false。如图所示:

[置顶] Android开发笔记(成长轨迹)_第30张图片

32,Fragment出现异常:java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

在使用Fragment保存参数的时候,可能是因为需要保存的参数比较大或者比较多,这种情况下页会引起异常。比如代码

 

[java]  view plain copy 在CODE上查看代码片
 
  1. Bundle b = new Bundle();  
  2. b.putParcelable("bitmap", bitmap2);  
  3. imageRecognitionFragment.setArguments(b);  
设置好参数,并且添加hide(),add(),方法之后,需要commit(),来实现两个Fragment跳转的时候,这种情形下参数需要进行系统保存,但是这个时候你已经实现了跳转,系统参数却没有保存。此时就会报这这个异常

 

分析原因:你并不需要系统保存的参数,只要你自己设置的参数能够传递过去,在另外一个Fragment里能够顺利接受就行了,现在android里提供了另外一种形式的提交方式commitAllowingStateLoss(),从名字上就能看出,这种提交是允许状态值丢失的。到此问题得到完美解决,值的传递是你自己控制的。
这里也说一下另外一个问题,bitmap 也可以通过Bundle传递的,使用putParacelable就可以了。

 

33,conversion to dalvik format failed with error 1

[置顶] Android开发笔记(成长轨迹)_第31张图片

在我们Android Tools--Export Signed Application Package 进行签名打包时会遇到这个问题,不是特别严重的问题,最简单的是刷新一下自己的工程,clean一下、再次打包,如果还不行就重新打开eclipse试试。

project.properties里Target改变一个其他的版本,再变回来保存一下(相当于刷新的操作)这样也能起到清理的作用。

 

34,在版本更新时,新版本数据库增加了字段,安装直接替换apk运行后报错(数据库字段找不到),除非卸载旧版本再安装新的

[置顶] Android开发笔记(成长轨迹)_第32张图片

主要是因为新增加了字段,在当前版本里查找字段时出错了,所以要切记一个问题,当更新版本时添加或删除了字段,数据库version一定要更换,也就是说新版本运行时要让系统知道数据库有更新,要remove db 然后再创建db,如下所示:

[置顶] Android开发笔记(成长轨迹)_第33张图片

35,android:layout_weight用法

layout_weight 用于给一个线性布局中的诸多视图的重要度赋值。默认为零,意思是需要显示 多大的视图就占据多大的屏幕空 间。若赋一个高于零的值,则将父视 图中的可用空间分割,分割大小具体取决于每一个视图的layout_weight 值以及该值在当前屏幕布局的整体 layout_weight值和在其它视图屏幕布局的layout_weight值中所占的比率而定。 

举个例子:比如说我们在 水平方向上有一个文本标签和两个文本编辑元素。 该文本标签并无指定layout_weight值,所以它将占据需要提供的最少空间。  如果两个文本编辑元素每一个的layout_weight值都设置为1,则两者平分在父视图布局剩余的宽度(因为我们声明这两者的重要度相等)。如果两个文本编辑元素其中第一个的layout_weight值设置为1,而第二个的设置为2,则剩余空间的三分之二分给第一个,三分之一分给第二个(数值越小,重要度越高)。 

 

36,xml文件中的转义字符

 

 HTML中<, >,&等有特别含义,(前两个字符用于链接签,&用于转义),不能直接使用。使用这三个字符时,应使用他们的转义序列,如下所示:

&amp; 或 &

&

&lt; 或 <

<

小于号

&gt; 或 >

>

大于号

&quot;

"

双引号

 

&nbsp;

 

 

空格

&copy;

©

版权符

&reg

®

注册符

  前者为字符转义序列,后者为数字转义序列。数字转为字符对应的ASCII码值。例如 & lt; font &gt;显示为,<font>,若直接写为则被认为是个链接签。

  需要说明的是:

  a. 转义序列各字符间不能有空格; 
         b. 转义序列必须以";"结束; 
     c. 独立的&不被认为是转义开始; 
        d.区分大小写。

  另一个需要转义的字符是引号,他的转义序列为"" "或"""

  HTML使用的字符集是ISO &859 Larin-1字符集,该字符集中有许多标准键盘上无法输入的字符。对这些特别字符只能使用转义序列。
  XML转义字符 
       不合法的XML字符必须被替换为相应的实体。

  如果在XML文件中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是个新元素的开始。所以不应该像下面那样书写代码:

<message>if salary < 1000 then</message>

  为了避免出现这种情况,必须将字符"<" 转换成实体,像下面这样:

<message>if salary &lt; 1000 then</message>

  下面是五个在XML文件中预定义好的实体:

&lt;

<

小于号

&gt;

>

大于号

&amp;

&

&apos;

单引号

&quot;

"

双引号

  实体必须以符号"&"开头,以符号";"结尾。

  注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是个好习惯。

 

37,如何读取当前项目版本信息(version name和version code)?

 

[java]  view plain copy 在CODE上查看代码片
 
  1. PackageManager packageManager = getPackageManager();  
  2. PackageInfo packInfo = null;  
  3. try {  
  4.     packInfo = packageManager.getPackageInfo(getPackageName(), 0);  
  5. catch (NameNotFoundException e) {  
  6.     e.printStackTrace();  
  7. }  
[java]  view plain copy 在CODE上查看代码片
 
  1. <span style="white-space:pre">            </span>int versionName = packInfo.versionName;  
  2.             int versionCode = packInfo.versionCode;  

 

38,如何判断当前是否有网络以及使用的网络环境(2G、3G或WIFI)?

 

[java]  view plain copy 在CODE上查看代码片
 
  1. /** 
  2.  * 判断当前是否有网络 有 返回 true 无 返回 false 
  3.  *  
  4.  * @param context 
  5.  * @return 
  6.  */  
  7. public static boolean isNetWorkAble(Context context) {  
  8.   
  9.     if (context == null) {  
  10.         throw new NullPointerException("context can`t be null!");  
  11.     }  
  12.     ConnectivityManager connManager = (ConnectivityManager) context  
  13.             .getSystemService(Context.CONNECTIVITY_SERVICE);  
  14.     if (null != connManager) {  
  15.         NetworkInfo[] networkinfo = connManager.getAllNetworkInfo();  
  16.         if (null != networkinfo) {  
  17.             for (int i = 0; i < networkinfo.length; i++) {  
  18.                 if (networkinfo[i].getState() == NetworkInfo.State.CONNECTED) {  
  19.                     return true;  
  20.                 }  
  21.             }  
  22.         }  
  23.   
  24.     }  
  25.     return false;  
  26. }  
判断网络环境:

 

[置顶] Android开发笔记(成长轨迹)_第34张图片

 

39,This tag and its children can be replaced by one <TextView/> and a compound drawable

当我们在xml里布局的时候,有时会遇到这样的一段黄色警告,简而言之就是说,我们可以优化一些(TextView可以直接添加图片)

 

[java]  view plain copy 在CODE上查看代码片
 
  1.    <LinearLayout   
  2.        android:orientation="horizontal"  
  3.        android:layout_centerInParent="true"  
  4.     android:layout_height="wrap_content"  
  5.     android:layout_width="wrap_content">  
  6.     <ImageView   
  7.         android:id="@+id/item_icon"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"/>  
  10.     <TextView  
  11.         android:id="@+id/item_text"  
  12.         android:layout_height="wrap_content"  
  13.         android:layout_width="wrap_content"  
  14.         android:text="@string/app_name"/>  
  15. </LinearLayout>  
看这个xml,发现原来可以直接给TextView加图片.. ,通过 setCompoundDrawable 方法, 或者直接在xml中使用android:drawableLeft.、android:drawableRight等属性指定!这样的话就省去了一个ImageView组件,岂不是更有效率一些?

 

40,SQlite 简单 事物处理

最近在做应用程序的集团版本,初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。应用有的账号有500+记录,需要500多次循环,insert。


解决方法:
添加事务处理,把500+条插入作为一个事务

我们使用SQLite的事务进行控制:
        db.beginTransaction();  //手动设置开始事务
        try{
            //批量处理操作
            for(Collection c:colls){
                insert(db, c);
            }
            db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交
           }catch(Exception e){
               MyLog.printStackTraceString(e);
           }finally{
               db.endTransaction(); //处理完成
           }

1.使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 方法设置事务的标志为成功则提交事务,如果没有调用setTransactionSuccessful() 方法则回滚事务。
2.下面两条SQL语句在同一个事务中执行:

 

[java]  view plain copy 在CODE上查看代码片
 
  1. try {  
  2.     database.beginTransaction();//开始事务  
  3.     for (Tracker tracker : lists) {  
  4.         Tracker t = findByTid(tracker.getTid()); //读取一条记录  
  5.         if (t != null) {  
  6.             tracker.setId(t.getId());//设置相应的属性  
  7.             tracker.setSelected(t.isSelected());  
  8.             tracker.setDeleted(t.isDeleted());  
  9.         }  
  10.         dao.createOrUpdate(tracker);//循环插入记录  
  11.     }  
  12.     database.setTransactionSuccessful();//保存提交  
  13.     database.endTransaction();//结束事务  
  14.   
  15. catch (Exception e) {  
  16. }  


41,使用googleMap如何获取两点(经纬度之间的距离)

方法一:

 

[java]  view plain copy 在CODE上查看代码片
 
  1. /** 
  2.  * 通过Location类获取两点间距离 单位:m 
  3.  *  
  4.  * @param slat起点经度 
  5.  * @param slon起点纬度 
  6.  * @param elat终点经度 
  7.  * @param elon终点纬度 
  8.  * @return 
  9.  */  
  10. public static int getDistance(double slat, double slon, double elat,  
  11.         double elon) {  
  12.     float[] result = new float[1];  
  13.     Location.distanceBetween(slat, slon, elat, elon, result);  
  14.     return (int) result[0];  
  15. }  

 

在没有类似android的Location的distanceBetween方法开采用如下代码获取:

 

[java]  view plain copy 在CODE上查看代码片
 
  1. double distance(double lat1, double lon1, double lat2, double lon2) {     
  2.         double theta = lon1 - lon2;     
  3.         double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2))     
  4.                     + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2))     
  5.                     * Math.cos(deg2rad(theta));     
  6.         dist = Math.acos(dist);     
  7.         dist = rad2deg(dist);     
  8.         double miles = dist * 60 * 1.1515;     
  9.         return miles;     
  10.     }     
  11.     //将角度转换为弧度     
  12.     static double deg2rad(double degree) {     
  13.         return degree / 180 * Math.PI;     
  14.     }     
  15.     //将弧度转换为角度     
  16.     static double rad2deg(double radian) {     
  17.         return radian * 180 / Math.PI;     
  18.     }     

 

 

42,Android 之Gson如何使用

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
jar和源码下载地址: http://code.google.com/p/google-gson/downloads/list

实体类:

 

[java]  view plain copy 在CODE上查看代码片
 
  1. public class Student {  
  2.     private int id;  
  3.     private String name;  
  4.     private Date birthDay;  
  5.   
  6.     public int getId() {  
  7.         return id;  
  8.     }  
  9.   
  10.     public void setId(int id) {  
  11.         this.id = id;  
  12.     }  
  13.   
  14.     public String getName() {  
  15.         return name;  
  16.     }  
  17.   
  18.     public void setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21.   
  22.     public Date getBirthDay() {  
  23.         return birthDay;  
  24.     }  
  25.   
  26.     public void setBirthDay(Date birthDay) {  
  27.         this.birthDay = birthDay;  
  28.     }  
  29.   
  30.     @Override  
  31.     public String toString() {  
  32.         return "Student [birthDay=" + birthDay + ", id=" + id + ", name="  
  33.                 + name + "]";  
  34.     }  
  35.   
  36. }  

测试类(Gson使用)

 

 

[java]  view plain copy 在CODE上查看代码片
 
  1. import java.util.ArrayList;  
  2. import java.util.Date;  
  3. import java.util.List;  
  4.   
  5. import com.google.gson.Gson;  
  6. import com.google.gson.reflect.TypeToken;  
  7.   
  8. public class GsonTest1 {  
  9.   
  10.     public static void main(String[] args) {  
  11.         Gson gson = new Gson();  
  12.   
  13.         Student student1 = new Student();  
  14.         student1.setId(1);  
  15.         student1.setName("kaka");  
  16.         student1.setBirthDay(new Date());  
  17.   
  18.         // //////////////////////////////////////////////////////////  
  19.         System.out.println("----------简单对象之间的转化-------------");  
  20.         // 简单的bean转为json  
  21.         String s1 = gson.toJson(student1);  
  22.         System.out.println("简单Bean转化为Json===" + s1);  
  23.   
  24.         // json转为简单Bean  
  25.         Student student = gson.fromJson(s1, Student.class);  
  26.         System.out.println("Json转为简单Bean===" + student);  
  27.       
  28.         // 简单Bean转化为Json==={"id":1,"name":"kaka","birthDay":"Jun 22, 2012 8:27:52 AM"}  
  29.         // Json转为简单Bean===Student [birthDay=Fri Jun 22 08:27:52 CST 2012, id=1,name=kaka]  
  30.   
  31.         Student student2 = new Student();  
  32.         student2.setId(2);  
  33.         student2.setName("coco");  
  34.         student2.setBirthDay(new Date());  
  35.   
  36.         Student student3 = new Student();  
  37.         student3.setId(3);  
  38.         student3.setName("caca");  
  39.         student3.setBirthDay(new Date());  
  40.   
  41.         List<Student> list = new ArrayList<Student>();  
  42.         list.add(student1);  
  43.         list.add(student2);  
  44.         list.add(student3);  
  45.   
  46.         System.out.println("----------带泛型的List之间的转化-------------");  
  47.         // 带泛型的list转化为json  
  48.         String s2 = gson.toJson(list);  
  49.         System.out.println("带泛型的list转化为json==" + s2);  
  50.   
  51.         // json转为带泛型的list  
  52.         List<Student> retList = gson.fromJson(s2,  
  53.                 new TypeToken<List<Student>>() {  
  54.                 }.getType());  
[java]  view plain copy 在CODE上查看代码片
 
  1.     for (Student stu : retList) {  
  2.         System.out.println(stu);  
  3.     }  
  4.   
  5.     // 结果:  
  6.     // 带泛型的list转化为json==[{"id":1,"name":"kaka","birthDay":"Jun 22, 2012 8:28:52 AM"},{"id":2,"name":"coco","birthDay":"Jun 22, 2012 8:28:52 AM"},{"id":3,"name":"柳波","birthDay":"Jun 22, 2012 8:28:52 AM"}]  
  7.     // Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=1, name=kaka]  
  8.     // Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=2, name=coco]  
  9.     // Student [birthDay=Fri Jun 22 08:28:52 CST 2012, id=3, name=caca]  
  10.   
  11. }  

43,Hashmap如何遍历所有的key?

方法一:

 

[java]  view plain copy 在CODE上查看代码片
 
  1. Map map = new HashMap();  
  2. Iterator iter = map.entrySet().iterator();  
  3. while (iter.hasNext()) {  
  4.     //通过Entity获得当前item  
  5.     Map.Entry entry = (Map.Entry) iter.next();  
  6.     Object key = entry.getKey();  
  7.     Object value = entry.getValue();  
  8.      
  9. }  

方法二:

 

 

[java]  view plain copy 在CODE上查看代码片
 
  1. HashMap<String, String> maps = new HashMap<String, String>();  
  2.       Iterator it= maps.keySet().iterator();  
  3.       while (it.hasNext())  
  4.       {  
  5.        Object key=it.next();  
  6.        System.out.println("key:"+key);  
  7.        System.out.println("value:"+maps.get(key));  
  8.       }  

 

 

44,Android中Parcelable注意事项

在实例化对象时,如果实现了Parcelable接口,一定注意两个方法中,get/set属性的顺序不要错了,否则会造成数据不一致。

[置顶] Android开发笔记(成长轨迹)_第35张图片

[置顶] Android开发笔记(成长轨迹)_第36张图片

45,Fragment异常:not attached to Activity

传送门:http://blog.csdn.net/walker02/article/details/7995407

 

46,Android自带Location和百度DistanceUtil计算两点间距离

 

[java]  view plain copy 在CODE上查看代码片
 
  1. float[] results = new float[1];  
  2. double lat = 144122796/3600000.0;  
  3. double lon = 418747182/3600000.0;  
  4. double plat =144121792/3600000.0;  
  5. double plon =418749216/3600000.0;  
  6. Location.distanceBetween(lat, lon, plat, plon, results);  
  7. System.out.println("Location:"+results[0]);  
  8. GeoPoint start = new GeoPoint((int) (144122796 / 3.6), (int) (418747182 / 3.6));  
  9. GeoPoint end = new GeoPoint((int) (144121792 / 3.6), (int) (418749216 / 3.6));  
  10. double distance = DistanceUtil.getDistance(start, end);  
  11. System.out.println("baidu:"+distance);  

输出:

01-21 14:33:33.060: I/System.out(6935): Location:57.310047
01-21 14:33:33.060: I/System.out(6935): baidu:56.9168298996976

可以看出百度和Android自带的算法计算出来的差距不是很大,其实出现不一样的结果,主要是算法过程中,椭球中的地球长半径数据不一致(WGS84和天朝的标准,你懂的),导致差异,具体可看如下算法公式。

 

47,国际国内通用两点间(经纬度)的距离算法:

 

[java]  view plain copy 在CODE上查看代码片
 
  1. static double DEF_PI = 3.14159265359; // PI  
  2. static double DEF_2PI = 6.28318530712; // 2*PI  
  3. static double DEF_PI180 = 0.01745329252; // PI/180.0  
  4. static double DEF_R = 6370693.5; // radius of earth  
  5.   
  6. /** 
  7.  * 利用勾股定理计算,适用于两点距离很近的情况 
  8.  *  
  9.  * @param lon1 
  10.  * @param lat1 
  11.  * @param lon2 
  12.  * @param lat2 
  13.  * @return 
  14.  */  
  15. public double GetShortDistance(double lon1, double lat1, double lon2,  
  16.         double lat2) {  
  17.     double ew1, ns1, ew2, ns2;  
  18.     double dx, dy, dew;  
  19.     double distance;  
  20.     // 角度转换为弧度  
  21.     ew1 = lon1 * DEF_PI180;  
  22.     ns1 = lat1 * DEF_PI180;  
  23.     ew2 = lon2 * DEF_PI180;  
  24.     ns2 = lat2 * DEF_PI180;  
  25.     // 经度差  
  26.     dew = ew1 - ew2;  
  27.     // 若跨东经和西经180 度,进行调整  
  28.     if (dew > DEF_PI)  
  29.         dew = DEF_2PI - dew;  
  30.     else if (dew < -DEF_PI)  
  31.         dew = DEF_2PI + dew;  
  32.     dx = DEF_R * Math.cos(ns1) * dew; // 东西方向长度(在纬度圈上的投影长度)  
  33.     dy = DEF_R * (ns1 - ns2); // 南北方向长度(在经度圈上的投影长度)  
  34.     // 勾股定理求斜边长  
  35.     distance = Math.sqrt(dx * dx + dy * dy);  
  36.     return distance;  
  37. }  
  38.   
  39. /** 
  40.  * 按标准的球面大圆劣弧长度计算,适用于距离较远的情况 
  41.  *  
  42.  * @param lon1 
  43.  * @param lat1 
  44.  * @param lon2 
  45.  * @param lat2 
  46.  * @return 
  47.  */  
  48. public double GetLongDistance(double lon1, double lat1, double lon2,  
  49.         double lat2) {  
  50.     double ew1, ns1, ew2, ns2;  
  51.     double distance;  
  52.     // 角度转换为弧度  
  53.     ew1 = lon1 * DEF_PI180;  
  54.     ns1 = lat1 * DEF_PI180;  
  55.     ew2 = lon2 * DEF_PI180;  
  56.     ns2 = lat2 * DEF_PI180;  
  57.     // 求大圆劣弧与球心所夹的角(弧度)  
  58.     distance = Math.sin(ns1) * Math.sin(ns2) + Math.cos(ns1)  
  59.             * Math.cos(ns2) * Math.cos(ew1 - ew2);  
  60.     // 调整到[-1..1]范围内,避免溢出  
  61.     if (distance > 1.0)  
  62.         distance = 1.0;  
  63.     else if (distance < -1.0)  
  64.         distance = -1.0;  
  65.     // 求大圆劣弧长度  
  66.     distance = DEF_R * Math.acos(distance);  
  67.     return distance;  
  68. }  
  69.   
  70. /** 示例 */  
  71. double mLat1 = 39.90923; // point1纬度  
  72. double mLon1 = 116.357428; // point1经度  
  73. double mLat2 = 39.90923;// point2纬度  
  74. double mLon2 = 116.397428;// point2经度  
  75. double distance = GetShortDistance(mLon1, mLat1, mLon2, mLat2);  

 

48,Unable to execute dex: Java heap space Java heap space

修改eclipse目录下面额eclipse.ini文件 
把第一行添加 
-vm
C:\Program Files\Java\jdk1.6.0_24\bin\javaw.exe (你jdk的目录)

修改
-Xms128m
-Xmx512m
修改
--launcher.XXMaxPermSize
512m

 

49,如何判断后台的service是否在运行?

 

[java]  view plain copy 在CODE上查看代码片
 
  1. public boolean isServiceRunning() {  
  2.     ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  
  3.   
  4.     ArrayList<ActivityManager.RunningServiceInfo> servicelist = (ArrayList<RunningServiceInfo>) manager  
  5.             .getRunningServices(30);  
  6.     if (servicelist.size() <= 0) {  
  7.         return false;  
  8.     }  
  9.     for (int i = 0; i < servicelist.size(); i++) {  
  10.         if (servicelist.get(i).service.getClassName().equals(  
  11.                 "com.dbjtech.find.UploadService")) {//我自己的服务  
  12.             return true;  
  13.         }  
  14.   
  15.     }  
  16.   
  17.     return false;  
  18.   
  19. }  

50,android:process=":remote"有啥用?

android:process=":remote",代表在应用程序里,当需要该service时,会自动创建新的进程。而如果是android:process="remote",没有“:”分号的,则创建全局进程,不同的应用程序共享该进程。

 

51,sdk manager更新失败,显示Download interrupted: read timed out

[置顶] Android开发笔记(成长轨迹)_第37张图片

解决办法:

sdk manager左上角选tools,再选options,将下面的force https......勾选上,重启sdk manager再试一下,应该可以成功。

 

52,eclipse中shift+ctrl+(Format)偶尔失效

其实是和别的软件的快捷键产生了冲突,具体可以看看最近安装了什么软件,看一下其热键。

在"Window"->"Preferences"->"General"->"Keys"中可以看到所有快捷键,看看你所用的快捷键是否被修改了,要是修改了的话点击"Restore Defaults"即可,或是把format的热键改成别的。

【注意】搜狗输入法是最喜欢使用shift+ctrl+字母或数字作为快捷键的,建议打开输入法设置属性--按键-快捷按键,把相关没用的全部取消了。

 

53,eclipse里找不到AVDManager 或Android SDK Manager的图标(已安装ADT插件)

1,查看当前的ADT是否是最新版本的,不是的话建议升级为最新版-help-install new software ,add https://dl-ssl.google.com/android/eclipse/

2,ADT没问题的话,打开Window-Customize Perspective,切换到Command Groups Availability 勾选上Android相关的选项,这个标签页就是配置工具栏要显示的功能列表,shortcuts标签页是设置比如NEW或show view时所需要显示的功能。

[置顶] Android开发笔记(成长轨迹)_第38张图片

[置顶] Android开发笔记(成长轨迹)_第39张图片

54,再按一次退出程序的实现方法

 

[java]  view plain copy 在CODE上查看代码片
 
  1. private long exittime;(全局)  
[java]  view plain copy 在CODE上查看代码片
 
  1. if (keyCode == KeyEvent.KEYCODE_BACK) {  
  2.     if ((System.currentTimeMillis() - exittime) > 2000) {  
  3.         Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();  
  4.         exittime = System.currentTimeMillis();  
  5.   
  6.     } else {  
  7.         finish();  
  8.     }  
  9.     return true;  
  10. }  

55,if (null == name)将null写在前面有什么说道?
在java里面,它们是一样的。但是为什么把name==null写成是null==name,具体点来说,是在C语言里面引申出来的。
在C语言里面,为了防止少敲一个等号,编程人员仍然能在编译的时候找到错误。因为if(name=null)是在编译的时候,不会出现错误,而if(null=name)是会编译出错。

故而,null==name,是在C语言的编程习惯引入进来的。当然了,在java里面,if(name=null)是会出现编译错误的,现在就不用担心这个了。但是,良好的编程习惯,还是写成null==name的好。http://bbs.csdn.net/topics/360174215

56,Only the original thread that created a view hierarchy can touch its views.

android中相关的view和控件不是线程安全的,我们必须单独做处理。我直接在button的onclick事件里进行了for循环,循环里直接进行了:

mHandler.removeCallbacks(runnable);

mHandler.post(runnable);

所有更新UI相关的操作,如果在子线程里进行,需要使用handler机制,在handler内更新。

57,Only the original thread that created a view hierarchy can touch its views

[置顶] Android开发笔记(成长轨迹)_第40张图片

android中相关的view和控件不是线程安全的,我们必须单独做处理。简而言之,在子线程里进行了UI更新的相关操作,所以要使用Handler机制。

 

58,手机号正则表达式"^1[3|4|5|8]\\d{9}$"

 

^ 首字母( 表示匹配一行的开始,既这个验证从^之后开始,第一位数就是1 )

 1  必须是1
[3-8] 第二个数字为3-8之间的(如果想匹配移动手机号,便可以从这里修改[3|4|5|8])
\\d表示数字(+\\d表示正整数)
{9}表示9个,就是9个数字(后面的9位每位都是从0-9之间的数字)
$ 结尾(匹配结束)
 
59,java.lang.IllegalStateException: Content has been consumed
这个问题是在使用HttpClient时遇到的,主要原因是多次调用了:
[java]  view plain copy 在CODE上查看代码片
 
  1. reply = EntityUtils.toString(response.getEntity());   
httpEntity.getContent()只能读取一次,多次读取的话就会出现这个Exception了。

60,Listview如何选中某一行item?(当前item自动滚动)
1,即可直接选择到指定的 item 并置顶
[java]  view plain copy 在CODE上查看代码片
 
  1. listView.setSelection(index);  
2,尝试获取每个item的高度,然后根据指定的个数,使用:
[java]  view plain copy 在CODE上查看代码片
 
  1. listView.scrollTo(0, index * heightPerItem);  
 每个 item 高度的计算有很多种方法,最简单的就是看你的布局如何实现的,直接写入数值即可如果是不确定的高度,那就只有等实例化之后才能 getHeigth 也可以获取。
 高度的计算需要待 listView 加载完毕后才获取其实际的高度,否则会得到 0。还有就是用 measure 方法:
[java]  view plain copy 在CODE上查看代码片
 
  1.  ListAdapter listAdapter = listView.getAdapter();    
  2.     int totalHeight = 0;   
  3.     for (int i = 0; i < listAdapter.getCount(); i++) {   
  4.         View listItem = listAdapter.getView(i, null, listView);   
  5.         listItem.measure(0, 0);   
  6.         totalHeight += listItem.getMeasuredHeight();   
  7.     }   
  8.     ViewGroup.LayoutParams params = listView.getLayoutParams();   
  9.     params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() – 1));   
  10.     ((MarginLayoutParams)params).setMargins(10, 10, 10, 10);  
  11.     listView.setLayoutParams(params);   
  12. 还有子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。  
 

61,使用代码为textview设置drawableLeft
 
在xml中设置了 DrawableLeft、但我想在代码中实时改变drawable,有什么方法可以使用代码为textview设置drawableLeft呢? 
方法一:
public void  setCompoundDrawables  (Drawable left, Drawable top, Drawable right, Drawable bottom);
[java]  view plain copy 在CODE上查看代码片
 
  1. Drawable drawable= getResources().getDrawable(R.drawable.drawable);  
  2.   
  3. drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());<span style="font-family: Tahoma;">//必须要setBounds,否则不会显示.</span>  
  4. tv.setCompoundDrawables(drawable,null,null,null);  

方法二:
public void setCompoundDrawablesWithIntrinsicBounds (Drawable left,Drawable top, Drawable right, Drawable bottom);
 
android:drawableLeft和layout:weight同时使用时如何居中?
 
android:drawableLeft设置的图片就是居左,但是注意,如果这个组件设置了layout:weight权重,那么图片无法和文字一起居中,文字属性可以通过android:gravity设置居中,想要android:drawableLeft设置的图片和文字一样居中,只能通过另外的方法来实现,因为drawableLeft的作用就是在组件左侧设置图片,如果你的组件宽度足够大,它照样一定会是在最左侧,否则居中的话,就不能是drawLeft了。
 

62,Android强行关闭Activity(结束进程)的几个方法:
一、结束一个活动Activity
  要主动的结束一个活动Activity,使用finish方法,而且这个方法最后会调用Activity的生命周期函数onDestroy方法,结束当前的Activity,从任务栈中弹出当前的Activity,激活下一个Activity。当然其他的finish系列方法,我们不在这里做详细讨论,有兴趣的同学可以自己查阅一下SDK 的文档。
二、强制结束当前的进程
  强行结束当前进程有两个方法。
  1、killProcess(int pid)              例子:android.os.Process.killProcess(android.os.Process.myPid());
这个方法使用是有条件的:
a、将被杀掉的进程 和 当前进程 处于同一个包或者应用程序中;
b、将被杀掉的进程 是由当前应用程序所创建的附加进程;
c、将被杀掉的进程 和 当前进程 共享了普通用户的UID。(这里的普通用户,是相对于Root权限的用户来说的)
  2、System.exit(int code)             例子:System.exit(0);
  该方法只能用于结束当前进程自身,在程序遇到异常,无法正常执行时,可以通过这个方法强制退出。
  需要注意的是,这两个方法,会导致进程非正常退出,就是说,进程退出时不会去执行onPause、onStop和onDestroy方法,那么进程很有可能错过了保存数据的机会。因此,这两个方法最好使用在出现异常的时候!
三、结束另一个进程
  要通过一个进程去结束另一个进程。在之前的SDK版本中,一直使用方法restartPackage(packageName)方法,但是在Android的开发文档中介绍说,这个函数会导致一些问题( the previous behavior here is no longer available to applications because it allows them to break other applications by removing their alarms, stopping their services, etc.),所以建议大家使用一个新的方法: 
  void killBackgroundProcesses(String packageName)
  由于这个方法没有返回值,所以我们也不知道我们的目标进程是否真的退出了。但是,我目前只发现了这个可以结束另一个进程的方法。
四、退出到主屏幕
  这个方法,也是退出当前进程的一个方法。如果我们在进程中创建了很多的Activity,但是又不想关闭时去退出不在任务栈顶的Activity,那么就可以直接使用这个方法了。
 
63,通过adb命令获取Android手机的IP地址
 先执行命令"adb shell netcfg" 
再执行命令 “adb shell ifconfig rmnet0”
64,通过adb命令安卓apk到devices
在cmd命令下,输入:
adb devices  (用于显示当前所有连接的设备)
adb install e:/test.apk (install后跟目标路径)
adb shell rm data/app/test.apk  (卸载)
在有多个设备(模拟器)时,需要制定设备号,adb devices 可以显示当前设备的序列号,在adb指令后加上参数-s<serialNumber> 比如 -s emulator-5554 ,就可以指定adb指令的目标
65,通过adb shell命令打开指定应用程序
      $ adb shell
      $ am start -n {包(package)名}/{包名}.{活动(activity)名称} 
[java]  view plain copy 在CODE上查看代码片
 
  1. adb shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n breakan.test/breakan.test.TestActivity  
或简单点:
[java]  view plain copy 在CODE上查看代码片
 
  1. adb shell am start -n breakan.test/breakan.test.TestActivity  
其中"breakan.test/breakan.test.TestActivity"中的"breakan.test"是程序的包名,"TestActivity"是程序Activity类的类名。
比如:
 
66,真机调试eclipse在file explorer中展不开data文件夹

 

这个需要真机已经进行root过了,然后在手机上装上R.E 管理器(或类似软件),将/data/data的权限修改为可读可写可执行,然后,就可以在eclipse中展开了。

 

67,如何把android textView字体大小固定写死,而不随系统设置字体大小的改变而改变?

sp是字体的单位,dp一般是宽,高等的单位,但是不同的机器有不同的密度,hdpi,mdpi,ldpi,xhdpi,在这些密度下,以sp、dp为单位,那么最终都会转换成px单位下的值,所以,用px为单位就是固定值。

 

68,EditText默认时不弹出软键盘的方法 

方法一:

在 AndroidMainfest.xml中选择哪个activity,设置windowSoftInputMode属性为 adjustUnspecified|stateHidden

   < activity android:name=".Main"
      android:label="@string/app_name"
      android:windowSoftInputMode="adjustUnspecified|stateHidden"
      android:configChanges="orientation|keyboardHidden">
  < intent-filter>
  < action android:name="android.intent.action.MAIN" />
  < category android:name="android.intent.category.LAUNCHER" />
  < /intent-filter>
  < /activity>

方法二:

让 EditText失去焦点,使用EditText的clearFocus方法

例如:
        EditText edit=(EditText)findViewById(R.id.edit);
  edit.clearFocus();

方法三:

强制隐藏Android输入法窗口

    EditText edit=(EditText)findViewById(R.id.edit);
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(edit.getWindowToken(),0)

你可能感兴趣的:(Android开发)