Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android開發過程常見問題解決方法收集

Android開發過程常見問題解決方法收集

編輯:Android開發實例

1、用(SDK starter package)的installler安裝Android SDK時提示無法找到JDK,但實際上機器上已經安裝了JDK。

一個對不少人有效的解決方法是看到此提示時先點一下“回退”按鈕,再點“下一步”,就會發現JDK被找到了。參考鏈接

但在我機器上這個方法不起作用。所以我選擇不使用installer,而是下載zip格式的文件,解壓縮後運行SDK Manager.exe即可。參考鏈接

2、在Eclipse裡新建一個Android項目,運行/調試時提示“Could not find xxx.apk!”

網上提到的大部分解決方案是clean整個項目,或選fix project properties菜單項。但對我的環境不起作用。

升級到Eclipse 3.7後,新創建的android項目在Build階段報告一個異常“sun/security/x509/X500Name”,懷疑與所用的jdk(IBM JDK6)有關。果然,卸載IBM JDK並安裝SUN JDK後問題解決。

3、讓程序適應不同的屏幕分辨率

可參考這個鏈接:Android屏幕分辨率問題。

4、在android模擬器裡用10.0.2.2可訪問宿主機。

5、在setWidth()方法裡指定的寬度是以pixel為單位的,如何轉換為使用dip(device independent pixels)為單位?

使用下面的代碼,參考鏈接

// Converts 14 dip into its equivalent px

Resources r = getResources();
float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 14, r.getDisplayMetrics());

6、彈出式對話框的用法,這個鏈接介紹得比較詳細。

7、導出apk文件時需要簽名,這個鏈接比較詳細。

8、android界面設計原則,參考這個鏈接。

9、使用merge(而不是layout)可以達到在避免重復寫layout的同時減少layout的數量。

10、真機USB調試比用AVD調試快得多,設置也很簡單,見這個鏈接。不過10.0.2.2不能用了,真機可以通過wifi訪問局域網內的服務器。

11、android-ui-utils,一個不錯的在線Android圖標生成器,地址在此。

12、調試時如果出現莫名其妙的空指針錯誤,例如findViewByID()返回null,先試試clean一下整個project,通常都能解決。

13、讓ListView裡無數據時顯示一行信息。

參考鏈接,注意ListView和TextView的id。

14、用自己的圖標替換ListView裡的RadioButton

在用作row的layout裡添加一個圖片,在java code裡覆蓋adapter的getView()方法,根據ListView的getCheckedItemPosition()結果設置圖片的可見性。注意不要通過setOnClickListener()方法設置view裡的圖片可見性,因為ListView只維護可見的那些row控件,這樣做會導致很奇怪的結果(點第一條記錄結果第二條記錄被選中,並且滾動ListView時選中狀態還會隨機變化,見此鏈接)。

另外一個辦法是通過style設置checkMark為所需要的圖標,可能是更簡單的解決方案(還沒試)。

Update: 以上結果基於對ListView實現不了解的情況,其實使用RadioButton是可以實現的,見#22。

15、ListView的selection和choice是完全不同的,所以不要指望ListView#clearChoice()能清楚你已經是checked狀態的那些item。

16、屏幕方向變化時(橫屏->豎屏,或反過來),ListView裡發生變化的內容丟失,狀態回到開始時的樣子。

當屏幕方向發生變化時,android會重建整個Activity以便你構造更適合某個方向的UI。為了避免這種情況,在AndroidManifest.xml裡的那個Activity聲明上增加android:configChanges="orientation" 即可。詳見參考鏈接。

17、各手機平台仿真器/模擬器的下載鏈接。

18、AlertDialog#show()方法是不會阻塞當前線程的。

19、讓不同Activity之間進行通信,例如一個TabActivity裡有多個Activity,它們之間需要傳遞一些消息。

可使用BroadcastReceiver機制。 參考鏈接。要注意的是,tab還未啟動時是無法接收到消息的,所以要在tabhost所在的activity裡也接收消息,當tab啟動時傳給它。

20、Android SDK裡的style和theme文檔

見此鏈接。

21、Tab的樣式。

Android的tab樣式問題比較多,不同版本的樣式也不一樣。這裡有一個自定義樣式的參考鏈接。

22、在ListView裡使用單選/復選按鈕。

問題很多,這個鏈接看起來解決了問題,但在我的環境裡沒試驗成功。

Update: 以復選按鈕為例,本質的問題在於ListView裡的復選按鈕不知道對應的model是哪個,需要事先用CheckBox#setTag(myModelObject)關聯,onclick事件裡用getTag()改變其選中狀態。建議看這篇文檔。

23、strings.xml裡定義的字符串裡增加參數。

在字符串裡用“%1$s”、“%2$d”表示參數的序號和類型,然後用String.format()方法賦值。參考這個鏈接。

24、嵌入條碼/二維碼掃描功能

使用zxing。方法是在手機上先安裝BarcodeScanner.apk,然後在程序裡調用其提供的Activity,該Activity會返回掃描結果。 參考鏈接

25、改變ListView裡每個Row的背景顏色

直接在getView()裡寫view.setBackgroundColor()是不行的。正確的方法是先在drawable目錄裡建一個xml文件,自己起名如my_row.xml,內容如下(關鍵是第一個和第四個<item>):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_window_focused="false" android:state_selected="true"
        android:drawable="@android:color/transparent" />
    <item android:state_selected="true" android:drawable="@android:color/transparent" />
    <item android:state_pressed="true" android:state_selected="false"
        android:drawable="@android:color/transparent" />
    <item android:state_selected="false" android:drawable="@color/solid_red" />
</selector> 

然後在getView()裡這樣寫就可以了:

 if (item.getStopId().equals(User.stopId)) {

    view.setBackgroundResource(R.drawable.my_row);
} else {
    view.setBackgroundResource(android.R.drawable.list_selector_background);
}

參考鏈接1 參考鏈接2 參考鏈接3

26、在一個TableLayout裡讓Button寬度相同並占滿表格寬度(想象一個由按鈕組成的九宮格)

如果Button上的文字不長,按一般的方法就可以實現,例如這個鏈接。當Button上的文字很長,還是會使布局變亂,每個列的長度將不一樣。解決方案是將按鈕的layout_width設為0,layout_height設置為所需要的值,需要換行時將singleLine設置為false,最後將按鈕的gravity設置為center。

27、對切換屏幕方向的處理

參考stackoverflow上的一個典型討論。

當MyActivity位於一個TabActivity裡時,我做了一些實驗表明, TabActivity是否聲明android:configChanges="keyboardHidden|orientation"與MyActivity無關,只有MyActivity做了上述聲明後才會在改變方向時觸發onConfigurationChanged()方法。

28、strings.xml裡的字符串包含html格式標簽時

需要用<Data><![CDATA[...]]></Data>把html代碼包起來。參考鏈接

29、在AlertDialog裡用ListAdapter(如ArrayAdapter)時,文字不顯示。

view的resourceId要用select_dialog_singlechoice而不能用simple_list_item_single_choice,否則文字顏色會與背景顏色相同而無法顯示。參考鏈接

30、在android程序裡使用第三方包的配置方法

參考這個鏈接成功。

31、定制tabhost的外觀

這方面的需求和問題網上都很多,主要的解決方案有基於tabhost的和基於radiobutton的兩大類,這裡有幾個可以參考的鏈接。鏈接1,鏈接2,鏈接3

32、取得當前屏幕方向

有好幾個方法可以得到orientation值,但一些得到的值不對,例如getWindowManager().getDefaultDisplay().getOrientation()和getReqestedOrientation()。我實驗下來比較靠譜的是getResources().getConfiguration().orientation。

33、Activity裡第一個View是EditText的時候,軟鍵盤自動彈出。

似乎只是一些機型會這樣做。要阻止軟鍵盤彈出,可在onCreate()裡加一行代碼。參考鏈接

 this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

34、Dialog的theme問題

使用Theme.Light主題時,Dialog顯示不正常。相關討論:鏈接1,鏈接2

35、注意區分CheckBox和RadioButton的OnClickListener和OnCheckedChangeListner

使用前者時,當在代碼裡執行myCheckBox.setChecked(true),不會觸發事件,而後者會觸發事件。

36、監視GPS開啟/關閉事件

用GpsStatus.Listener不可靠(事件不上來),這個鏈接的方法是監視Settings裡的事件:參考鏈接

37、仿真器橫屏

快捷鍵ctrl+f11。有人提到ctrl+f12和numpad 7也可以,但我這裡不起作用。

38、用JAXB生成KML對應的Java Code時會遇到一些問題,解決方法如下:

1)寫一個binding文件如bindings.xjb放在與ogckml22.xsd同一目錄,內容可參考這個鏈接(根據錯誤提示要刪除幾行)

2)在命令行裡加-extension

3)在命令行裡加-target 2.1(否則生成的java類的annotation帶有jdk6不識別的關鍵字"required")

完整的命令行如下:

xjc -xmlschema -verbose -extension -b bindings.xjb -d src -target 2.1 ogckml22.xsd 

39、ListPreference的entryValues只能使用string-array

如果使用了integer-array,在點擊這個preference項時會產生一個空指針異常,相關討論見鏈接1、鏈接2。

Update: 又發現一個ListPreference的新問題,即使用string-array,defaultValue值也不能取太大的(超過Integer.MAX_VALUE)整數,否則defaultValue不起作用(選項沒有缺省被選中)。 真是問題多多。android版本2.2。

40、Android提供了方便的Share機制,但一般都是把文字share到微博或SMS,如何能"share"文字到SD卡文件呢?

這個鏈接描述了同樣的問題,等待有人回答。 目前的想法是,在程序裡自己實現一個接受ACTION_SEND的activity,做法可參考此鏈接、或此文章。

41、一個在線查看kml文件的網站,供參考。

GPS Visualizer

42、關於onSaveInstanceState()的使用

通常與onCreate()配合,而非onRestoreInstanceState(),參考這個鏈接。

43、ListView裡點擊一個item背景色不變為橘黃(缺省的反饋顏色),各種OnClick事件不被觸發。

一種可能是在item的布局文件(如foo_list_row.xml)裡使用了下面的這些屬性(自動滾動顯示文字時常會用到),去掉後即可恢復正常:

android:ellipsize="marquee" android:scrollHorizontally="true"
android:marqueeRepeatLimit="marquee_forever" android:focusable="true"
android:focusableInTouchMode="true" 

44、實現不停向上滾動的ListView

假設你有一個長長的list需要自動展示,方式是每隔幾秒向上滾動一行,有點類似TextView的marquee功能(跑馬燈?)。這個需求可以通過Handler實現,具體參考這個鏈接;當列表滾動到最後一行時,直接滾回第一行顯得很生硬,可以用這個鏈接裡提供的方法解決。

45、在Button的文字旁加圖片

在<Button>裡使用android:drawableLeft="@drawable/my_icon" android:gravity="left|center_vertical"即可,類似的可以加在右側或上下方。但如果Button有其他狀態時,需要用selector指定不同狀態下的圖片。此外,圖片的大小是不會自動根據Button調整的。

46、舊版本兼容

參考sdk文檔裡的這個文章。

47、輕松實現圓角背景

不需要做圓角圖片,看看這個鏈接,很方便,注意把angle改為45的倍數否則運行時報錯。

48、Android內存洩漏檢測

在DDMS可以查看heap使用情況,大概了解是否有內存洩漏。DDMS還可以dump出.hprof文件,後者可以用Eclipse MAT打開,進一步分析錯誤原因。注意,startActivity()後要根據情況決定是否調用finish()方法(如果需要back則不finish(),在適當的時機用FLAG_ACTIVITY_CLEAR_TOP一並回收內存空間),未finish()的activity是會一直占用內存的。

49、Android的第三方library

這個鏈接總結了不少。

50、Android UI設計模式

參考這個鏈接。

51、Google Map擴展的使用。

參考這個鏈接。

52、當Spinner是invisible狀態時,貌似調用mySpinner.setSelection(i) 不會觸發其onItemSelected()事件。

53、實現gzip壓縮服務器返回的json對象時,注意要response.setContentType("application/json"),並且在server.xml裡把application/json設置到compressableMimeType裡才能實現。我因為前一個原因浪費了三四個小時。

54、對AlertDialog.Builder應用定制的theme

使用ContextThemeWrapper,用法參考這個鏈接。但後來發現這個方法不起作用,有一種說法是這個方法只對部分android版本有效,也有說其根本無效的(都是在so上)。用AlertDialog.Builder的setVIew()方法也是有問題的,因為你會發現在這個view的旁邊一圈(假設你的view是淺色背景)還是黑色的,效果很不好。其實如果只是要將對話框設置為白色背景,可以使用AlertDialog.Builder的setInverseBackgroundForced(true)方法,很簡單,很直接。

55、從gallery選擇圖片的一些可用參數

參考這個鏈接,和這個相關issue (文件得不到原始圖片,只能得到縮小後的圖片)。

56、從gallery取圖片時要注意內存是有限的,而圖片可能很大。

利用inSampleSize可以幫助解決,參考這個鏈接的代碼。

57、當程序進程被系統kill掉(常常在內存緊張時發生):

HttpClient的session可以用persist方式保留;

其余數據建議保留在SharedPreferenes裡;

onActivityResult()裡是能夠獲得另一個activity傳回來的intent裡的參數的;

58、連接到真機時提示Unable to open sync connection!

原因未知,解決方法是在真機的設置裡去掉usb調試,然後重新勾選。

59、得到GPS狀態(尋星或已獲得位置)

這個問題看似簡單,但Android裡的LocationListener#onStatusChanged()方法工作不正常,表現為在大多數版本下都不會被調用。這個鏈接裡提供的方法試了一下好像是可以用的。

60、在Android裡畫統計圖(柱圖餅圖等等)

這個鏈接裡給出了不少解決方案,我暫時選擇的是aChartEngine,用法和JFreechart比較類似,參數超多,目前的活躍度也不錯。

61、進程經常被kill

可以考慮啟動一個service,這樣進程的“重要性”就變得很高,因此就不容易被kill了。

62、“Receiver not registered”錯誤

執行unregisterReceiver(myReceiver)方法時,如果之前沒有注冊過myReceiver,會拋出這個異常。參考鏈接

63、應用在後台運行,需要彈出對話框(例如觸發自service產生的事件)時報錯:“BadTokenException: Unable to add window”

利用isFinishing()測試activity是否在後台,參考鏈接

64、Emulator太慢了?

試試Android x86,據說比官方的快很多(我還沒試過,正在下載)。 參考鏈接

65、禁止自動切換到橫屏模式
<activity android:name=".SomeActivity" android:label="@string/app_name" android:screenOrientation="portrait">...</acivity> 

參考鏈接

66、幾個眾包模式的beta測試平台

iOS最著名的是testflight,也有其他一些類似的測試平台支持android,詳見這個鏈接。

67、實現鎖機後黑屏但不出現鎖機畫面

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);

還有一個功能類似的flag是FLAG_DISMISS_KEYGUARD,區別在於前者只對當前activity有效,後者全局有效。另外前者對安全鎖屏也有效,後者則只對普通鎖屏有效。附一個參考鏈接。

但是前者有一個問題,就是在兩個都設置了FLAG_SHOW_WHEN_LOCKED的activity間切換時,可能鎖屏界面會閃一下。見此問題報告。

68、一些可用於android應用性能測試和內存洩漏檢測的工具

見這個鏈接。

69、進度條的一個bug

重設setMax()以後顯示的進度百分比不正確,至少在Android 2.1 (API Level 7)裡有這個問題。 見這個鏈接和這個鏈接。

70、當ListView的item裡包含控件(如按鈕、復選框)時 ,這個item無法被選中。

Android不允許選中ListView裡帶有focusable元素的item,解決方法是將該控件的focusable屬性設置為false。參考鏈接

71、幫助做簡單web測試的工具(構造並發送各種http請求)

這個鏈接裡總結了不少。

72、Tab放在底部(仿iphone風格)

中文的教程看了好幾個都不靠譜,so上的一個鏈接搞定,或者這個帶有源碼的教程。

73、讓ListView沒有數據時也顯示HeaderView/FooterView

技巧是讓empty view包含headerview/footerview,見這個鏈接。

74、在Google map上添加popup的方法

最簡單的方法見這個鏈接。

75、一個網站,可以搜索android相關項目的代碼和資源。

鏈接在此

76、Android裡的Search Activity不支持返回結果到調用其的Activity(因為onSearchRequested()方法沒有調用startActivityForResult()啟動search activity)

SO上有若干個提出此問題的帖子,例如鏈接1、鏈接2等等,沒有特別方便的辦法解決,一個我沒試過但看回復應該可行的方法見這個鏈接。

77、查看apk文件內容的工具

推薦apktool,一個命令行工具,用法如下:

>apktool.bat d my.apk

可以還原所有的資源文件,但.java文件一般無法還原。

78、Android中使用的各類圖標的標准尺寸

請參考sdk自帶的guideline文檔。

79、Android的Searchable接口,無法讓調用者獲得查詢結果。

參考這篇文檔可以實現,思路是自己用startActivityResult() 啟動搜索界面,然後再onActivityResult()裡取出結果。我測試可行,但該文檔有兩處錯誤需要注意:

1) 是handleIntent()而非handleActivity()

2) 在startActivityResult()前最好intent.setAction(Intent.ACTION_SEARCH) 一下。

另外,注意按該文章中提到的官方文檔實現相應的newIntent()和onCreate()方法,以及在AndroidManifest.xml裡設置調用者的android:launchMode="singleTop"。

80、很詭異的問題,有時EditText無法輸入文字(軟鍵盤正常彈出但字符進不去文本框),必須切換到另一個輸入法才可以輸入。

經測試,有些機型存在這個問題,具體原因還不詳。以下鏈接可能與此有關:鏈接1

81、定時重復執行一段程序

要執行類似鬧鐘這樣的功能,用AlarmManager配合BroadCastReceiver即可,網上有很多例子不再贅述。值得一提的是,在這個BroadCastReceiver裡不要執行異步操作(例如異步訪問一個遠程服務、獲取當前位置等等),因為onReceive()方法一旦執行結束,用於容納BroadCastReceiver的進程隨時可能被系統kill掉,導致異步操作結束後出現異常。解決的辦法是在onReceive()方法裡啟動一個Service(我用的是startService,用bindService的方式可能也行),在Service裡執行任何操作就可以了。參考BroadCastReceiver Life Cycle

82、Monkey測試

>adb shell monkey -v -p com.my.app 100 

MonkeyRunner可以進行更高級的測試。

83、用getIntent().getExtras().clear()無法清除掉extras裡的數據

原因是getExtras()返回的是一個copy實例,用getIntent().removeExtra()可一個個清除。參考鏈接

84、用AlertDialog實現輸入對話框時,若直接builder.setView(myEditText)文本框顯得太長。

用dialog.setView()可以指定padding(注意是dialog.setView()而不是builder.setView()),具體見這個鏈接。

85、在TextView裡顯示圖片

通過Html.fromHtml()方法可以在TextView裡顯示HTML格式的文本,但只支持部分tag:

myTextVIew.setText(Html.fromHtml(myHtmlStr))

要在TextView裡顯示遠程圖片,必須向fromHtml()函數裡提供一個ImageGetter對象,在它的getDrawable()方法裡獲取遠程圖像並轉換為Drawable類型。示例代碼請參考此鏈接。

如果TextView設置了android:lineSpacingMultiplier屬性,將導致圖片顯示的位置不正確(頂部多出一些空白),用android:lineSpacingExtra屬性則沒有這個問題。

如果圖片加載比較慢將導致整個TextView空白很長時間,為解決這個問題需要異步加載圖片,這樣文字可以先出來,待圖片下載完畢後再補充道文字中間。實現方法是擴展Drawable,具體方法參考這兩個鏈接:鏈接1、鏈接2 ,其中鏈接1的方案存在圖片尺寸不正確的問題,原因是TextView#invalidate()沒能起作用(原因不詳),用鏈接2提供的方法可以解決,這個鏈接提到用textView.setText(textView.getText())也可以工作但我沒試。

86、在TextView裡顯示列表(<li>標簽)

Android的TextView只支持一小部分的html標簽(見這個鏈接),缺省是不支持<ol>、<ul>和<li>這樣的列表標簽的。通過TagHandler可以實現一個簡單的列表效果(見此鏈接),但這個方法有個嚴重問題:當列表文字超過一行時,第二行的文字是頂頭的沒有縮進效果(見這個提問),而該問題暫時還沒有好的解決方法。

轉自:http://www.cnblogs.com/bjzhanghao/archive/2011/06/28/2092514.html

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved