Android開發筆記

轉載:http://blog.csdn.net/mad1989/article/details/9142557,請註明轉載地址,尊重作者的勞動成果



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 谷歌地圖開發時,控制檯輸出:



也就是調試時真機運行後地圖顯示空白。造成這種現狀的原因是由於 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 的那個:

,

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的標籤,網上有說過只要在佈局文件中添加如下代碼即可:

  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


這個問題是我們添加了多個開源應用例如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後面有個空格和點) 回車即可。



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



解決辦法:



   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,缺少哪個就添加哪個,缺一不可多餘的全部刪除】

   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項目本身都無法引用到,如下:




解決辦法:

右鍵項目,build path ----->config build path 在SourceTab欄,addFolder:這一回添加src


在看看項目組織:


沒問題了吧。


12,獲取當前設備屏幕寬度和高度

  1. Display display = getWindowManager().getDefaultDisplay();  
  2. display.getWidth();  
  1. <span style="white-space:pre">        </span>display.getHeight();  

13,項目工程下的lint.xml什麼作用?


代碼性能改進工具,Lint會自動掃描現有工程的Java和xml文件,給出性能優化改進建議,最終將會在Android的工程目錄下生成lint.xml文件。簡單點說就是檢查項目裏不推薦的代碼文件。


14,無論真機還是模擬器運行項目,總是閃退,後臺報錯Class找不到:



解決:找半天,clean好多次,都解決不了,一開始以爲少了相關的庫文件或路徑不對,後來才發現,只要把R文件裏的所有包下的文件全部remove掉,讓系統自動重新生成,就可以拉。



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


這個錯誤是指apk打包時發現:org.osmdroid.views.MapView找不到,但是我們在代碼裏,引用此路徑,就能找到MapView,後來終於想到:

這個jar包在Android private Libraries裏

build config裏應該勾選這個,否則打包時不會添加android Private Libraries裏的庫



16,基於XMPP的android連接openfile服務時出錯:SASL authentication DIGEST-MD5 failed 




出現這個問題是由於客戶端連接openfile時SASL驗證出錯,網上找了些相關資料,說是關閉相關鑑權驗證就可以了:

  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對應)就可以了。


參考文章:

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://"

  1. HttpPost post = new HttpPost("http://gps.google.com/geo");  


18,真機調試時錯誤:INSTALL_FAILED_INSUFFICIENT_STORAGE

出現這個問題,原因是設備(真機或模擬器)的內容空間不足,APP無法安裝,如過用的手機,刪除一些沒用的軟件騰出一些空間來,如用的是模擬器,設置device的內存更大一些。


19,如何把工程項目下的文件歸檔?(use as Source Folder)


(我們有時候看項目下會有上圖中的文件夾打開後都是一層包一層(樹狀)的並不像com.ka.tradk這樣,原因在於當前的包不是Source Folder)

添加完後感覺特別混亂,還是有錯誤,就看本文第11個截圖的解決辦法,右鍵點擊工程,選擇 "Properties",選擇左邊的 "Java Build Path",打開 "Source" 標籤面板,點擊 "Add Folder...",刪除沒用的,勾選 "gen和src" 文件夾,點擊OK,點擊YES,再點擊OK。


20,在java中,如何四捨五入保留小數點x位?

方法一:

  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

方法二:

  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


解決辦法:

1,點中項目右鍵  Properties

2,左邊Android列表打開 Android Lint Preference,如下圖:


3,在上圖右上角,點擊文字超鏈接,Configure workspace settings,如下圖:


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。

  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屬性。

  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類型的鍵盤:


fuelcity和fuelhighway都是EditText
  1. fuelCity.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);  
  2. fuelHighway.setInputType(InputType.TYPE_CLASS_NUMBER|InputType.TYPE_NUMBER_FLAG_DECIMAL);  

  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

  1. String path = Environment.getExternalStorageDirectory().toString()  
  2.         + "/test.png";  
  3. Bitmap mSharedPic = BitmapFactory.decodeFile(path);  
轉化爲Imageview

  1. ImageView iv = (ImageView) findViewById(R.id.image_test);   
  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);

  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裏添加:

  1. target=android-17  
  2. android.library.reference.1=..\\LibSlidingMenu2  


方法二:

手動導入:


導入完成後:


方法二的和一的區別在於路徑引用上,如上圖,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)

直接附上實現代碼,截取當前屏幕,並保存到手機內。

  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. }  

實現:

  1. Bitmap bitmap = takeScreenShot();  
  2. saveScreenShot(bitmap, Constants.defaultScreenPath);  


30,android-support-v4.jar混亂衝突


這是由於不同的library同時引用了android-support-v4.jar,但是他們不是同一個文件,SHA-1不相同,系統只允許libraries must be the same,所以我們刪除那個不相同的jar包,把其餘的使用同一個的jar拷貝到library裏就可以了。


31,eclipse中git插件的cannot open git-upload-pack問題


我們在eclipse上使用插件egit向代碼服務器push或pull代碼時,有時候會發現出現cannot open git-upload-pack這個問題。一般引起這個問題的原因有兩個:

一、網絡問題,確定你可以訪問自己所要操作的代碼倉庫地址!【這是最關鍵的,我就是折騰半天發現公司關閉了地址的外網訪問】

二、eclipse中git插件的配置問題。

打開eclipse中的windows-->Preferences-->Team-->Git-->Configuration-->User Settings.然後點Add Entry新建一個鍵值對,輸入http.sslVerify=false。如圖所示:


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

在使用Fragment保存參數的時候,可能是因爲需要保存的參數比較大或者比較多,這種情況下頁會引起異常。比如代碼

  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 Tools--Export Signed Application Package 進行簽名打包時會遇到這個問題,不是特別嚴重的問題,最簡單的是刷新一下自己的工程,clean一下、再次打包,如果還不行就重新打開eclipse試試。

project.properties裏Target改變一個其他的版本,再變回來保存一下(相當於刷新的操作)這樣也能起到清理的作用。


34,在版本更新時,新版本數據庫增加了字段,安裝直接替換apk運行後報錯(數據庫字段找不到),除非卸載舊版本再安裝新的


主要是因爲新增加了字段,在當前版本里查找字段時出錯了,所以要切記一個問題,當更新版本時添加或刪除了字段,數據庫version一定要更換,也就是說新版本運行時要讓系統知道數據庫有更新,要remove db 然後再創建db,如下所示:


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)?

  1. PackageManager packageManager = getPackageManager();  
  2. PackageInfo packInfo = null;  
  3. try {  
  4.     packInfo = packageManager.getPackageInfo(getPackageName(), 0);  
  5. catch (NameNotFoundException e) {  
  6.     e.printStackTrace();  
  7. }  
  1. <span style="white-space:pre">            </span>int versionName = packInfo.versionName;  
  2.             int versionCode = packInfo.versionCode;  

38,如何判斷當前是否有網絡以及使用的網絡環境(2G、3G或WIFI)?

  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. }  
判斷網絡環境:



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

當我們在xml里布局的時候,有時會遇到這樣的一段黃色警告,簡而言之就是說,我們可以優化一些(TextView可以直接添加圖片)

  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語句在同一個事務中執行:

  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如何獲取兩點(經緯度之間的距離)

方法一:

  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方法開採用如下代碼獲取:

  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

實體類:

  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使用)

  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());  
  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?

方法一:

  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. }  

方法二:

  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屬性的順序不要錯了,否則會造成數據不一致。



45,Fragment異常:not attached to Activity

傳送門:http://blog.csdn.net/walker02/article/details/7995407


46,Android自帶Location和百度DistanceUtil計算兩點間距離

  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,國際國內通用兩點間(經緯度)的距離算法:

  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是否在運行?

  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


解決辦法:

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時所需要顯示的功能。



54,再按一次退出程序的實現方法

  1. private long exittime;(全局)  
  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中相關的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時遇到的,主要原因是多次調用了:
  1. reply = EntityUtils.toString(response.getEntity());   
httpEntity.getContent()只能讀取一次,多次讀取的話就會出現這個Exception了。

60,Listview如何選中某一行item?(當前item自動滾動)
1,即可直接選擇到指定的 item 並置頂
  1. listView.setSelection(index);  

2,嘗試獲取每個item的高度,然後根據指定的個數,使用:
  1. listView.scrollTo(0, index * heightPerItem);  
 每個 item 高度的計算有很多種方法,最簡單的就是看你的佈局如何實現的,直接寫入數值即可如果是不確定的高度,那就只有等實例化之後才能 getHeigth 也可以獲取。
 高度的計算需要待 listView 加載完畢後才獲取其實際的高度,否則會得到 0。還有就是用 measure 方法:
  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(00);   
  6.         totalHeight += listItem.getMeasuredHeight();   
  7.     }   
  8.     ViewGroup.LayoutParams params = listView.getLayoutParams();   
  9.     params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() – 1));   
  10.     ((MarginLayoutParams)params).setMargins(10101010);  
  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);
  1. Drawable drawable= getResources().getDrawable(R.drawable.drawable);  
  2.   
  3. drawable.setBounds(00, 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)名稱} 
  1. adb shell am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n breakan.test/breakan.test.TestActivity  
或簡單點:
  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);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章