Android開發遇到的細節問題(一)

持續更新中。。。

1 爲什麼按鈕XML綁定的點擊事件出錯,或者無效?

例如:

<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/button_send"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button_send"
    android:onClick="sendMessage" />

綁定了一個名爲 sendMessage的方法.

/** Called when the user touches the button */
public void sendMessage(View view) {
    // Do something in response to button click
}

請仔細看以上代碼,有三個地方需要注意:

public void sendMessage(View view)

1 公有的

2 返回值爲void

3 唯一的參數爲View


2 開發widget 時,遭遇警告:Unable to launch app ...

Unable to launch app abc/10036 for broadcast Intent { act=android.appwidget.action.APPWIDGET_ENABLED cmp=ABC/.ClockWidget }: process is bad

查閱了相關資料,其中一種解決方法是:

我遵循了開發嚮導並在manifest中寫下了如下屬性,android:label="@string/app_name" ...

但是,要解決上面的那個問題的話,你需要

  1. Uninstall your app 卸載你的程序
  2. Reboot phone/emulator  重啓你的電話/仿真器
  3. Push new app without this attribute 去掉這個屬性,然後重新安裝

是的,這樣就好了,很神奇。


3 無法啓動郵件軟件& 啓動郵件後接收者丟失

在網上面,有人告訴你啓動郵件是通過 Intent.ACTION_SEND 來進行的

例如:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{emailAddress});
intent.putExtra(Intent.EXTRA_SUBJECT, title);
intent.putExtra(Intent.EXTRA_TEXT, email_content);

但如果要正確的打開,應該加上一行:

intent.setType("plain/text");

或者

intent.setType("text/plain");

其中,第一種只會打開電郵,而第二會打開各種程序(包括瀏覽器,微博,微信,短信,WIFI等等)


此外,要注意郵件地址可能存在多個,所以應該是字符串數組,即 String[]


4 代碼移植可能存在的問題

(1)Activity 可能未正確設置:

比如從一個工程中拿出一小塊來成立一個單獨的項目,或者將一個單獨的項目整合到工程中,下面這幾行需要增加或者刪除。

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

有些Activity爲了防止被外部調用,增加了exported屬性,如果成爲了單獨的程序,而它又是啓動界面時,需要允許外部調用,即設爲true。

<activity
    ...
    android:exported="false"
    ...>
</activity>

(2)自定義View未更新

請檢查XML佈局文件,確保你的佈局文件進行了更新。


(3)遺漏某些權限

移植時,一定要確保權限也隨之移動過去,否則相應的代碼得不到執行,會導致奇怪的錯誤。


5 Dialog錯誤: ExceptionMethod:setView ;

Unable to add window -- token null is not for an aplication
正如我們所知道的,Activity是Context的子類,很多時候傳遞Content總是使用 ThisActivity.this傳遞到需要使用Context作爲參數的方法中去。
但其實更推薦使用 getAplicationContext,這樣可以避免開啓的Activity因爲持有某些未被釋放的資源而不可以被清除。
但是,在Dialog中,卻推薦使用Activity,這是因爲Dialog是依附於對應的Activity的,傳遞應用程序的Context將導致錯誤。

6 相機報錯
java.lang.RuntimeException: Method called after release()

原因:
camera.stopPreview();
camera.release();前
沒有將setPreviewCallback 設置爲null,

解決辦法:

public void surfaceDestroyed(SurfaceHolder holder) {
     camera.setPreviewCallback(null) ;
     camera.stopPreview();
     camera.release();
     camera = null;
}

*此外,可能需要對camera.release();camera = null;兩句做synchronized。


7.UnsatisfiedLinkError 

NDK開發程序過程中,請勿隨意更改包名,否則會導致無法使用


8. [  .9.PNG出現問題

.9.PNG 點區域請使用2px及以上,使用1px的拉伸可能會出現問題

這個問題的根本原因是.9黑色拉伸指示區域(也就是四周的黑線)也會根據屏幕的dpi做縮放,

這就導致放在XHDPI下的只點一個點的.9.png可能在縮放到MDPI下時可能丟失信息


9. 動畫Animation在4.x系統上沒問題,但是在2.x系統上面就無法播放

可能是因爲你的View不可見導致的問題

在2.x系統上,對於不可見的物體,是無法使用View動畫的


10. android.content.res.Resources$NotFoundException

可能的原因:出現同名指定錯誤。

例如你有一個abc.xml的layout文件,然後裏面的它包含一個View的id="@+id/abc"

然後你在代碼中使用了R.id.abc 而不是R.layout.abc 就可能導致這個問題。



11. 2.x系統上面TextView沒有Press效果, ImageView沒有Press效果

這是因爲這些View不是Button,某些系統認爲其不具有獲取點擊事件的能力。


所以你需要

(1)設置Clickable

在Xml中  android:clickable="true"

在Java代碼中 view.setClickable(true);


(2)將事件派發給父容器*  (這一步是可選的,如果你爲父容器綁定了Onclicklistener)

OnClickListener listener = new OnClickListener() {


            @Override
            public void onClick(View v) {
                MyParentView.this.performClick();
            }
        };

childView.setOnclickListener(listener);



12 View.setText(Html.fromHtml(getString(...))) 獲取字符串無多個空格

考慮方法一:

不使用getString(...) ,而是使用getResources().getText(id)

因爲getText會保留其中的格式。

缺點是:不可以帶參數。


考慮方法二:

在其中加入 &#160;  這是一個與   不同的空格字符,它不會被String.trim()方法給幹掉,這就使得即使你通過getString(...)也能獲得正確的格式。



13 低版本的安卓系統上 margin無效的問題

參考資料:http://blog.csdn.net/fengye810130/article/details/9147695

在要設置Margin的View中加入android:layout_gravity="top|left",則Margin失效問題可以順利解決

但是,如果你不是marginTop 和marginLeft的話,請不要使用上面這種方式,而是直接在FrameLayout上面設置margin.




14 A fatal error has been detected by the Java Runtime Environment

這個是因爲android 編譯生成資源文件class出錯造成的問題

檢查並修復你的資源文件中的錯誤,然後點選clean,讓其重新編譯生成R.class



15 intentservice無法啓動問題:Unable to instantiate service 的解決辦法

由於通常採用的Intent 中帶有的參數是MyService.class 所以它通過反射方式啓動。

這就要求我們爲其提供一個無參數構造方法。


16 Android佈局文件中無法自動完成

   *2個原因

1>打開的編輯器不對,導致了無法自動完成android layout Editor

解決方法:在Eclipse選擇特定的文件,右鍵,open with -> Android Common XML Editor (也有的版本是Android Layout Editor)


2>添加了自定義的佈局

這就意味者你創建了新的scheme,它是這樣的東西:

xmlns:app="http://schemas.android.com/apk/res/com.abc.xyz"

將該行刪除,將相關控件註釋起來,然後正確編譯

然後再恢復,就可以用自動完成功能了。

發佈了34 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章