2012-03-18 65 views
1

我在三星Galaxy S II(GT-I9100G)&三星NTT DOCOMO Galaxy S II LTE(SC-03D)上看到此。ArrayIndexOutOfBoundsException當調用Dialog.show()

我正在針對10級(最低等級3)構建等級14。

我認爲這是與主題有關,但不知道從哪裏開始。我很確定這不會發生在所有的Galaxy SII上,否則我會得到更多的報告。

或者,也許活動已被銷燬此代碼被調用 - 會導致它?

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setIcon(R.drawable.app_icon); 
builder.setTitle("my title"); 
builder.setMessage("my message which has about 7 lines and each line is short"); 
builder.setPositiveButton(R.string.ok, null); 
builder.show(); 

日誌貓:

java.lang.ArrayIndexOutOfBoundsException: null 
at android.content.res.TypedArray.getInt(TypedArray.java:248) 
at android.widget.ScrollView.<init>(ScrollView.java:173) 
at android.widget.ScrollView.<init>(ScrollView.java:161) 
at java.lang.reflect.Constructor.constructNative(Constructor.java:-2) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:415) 
at android.view.LayoutInflater.createView(LayoutInflater.java:505) 
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:623) 
at android.view.LayoutInflater.rInflate(LayoutInflater.java:626) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:408) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:215) 
at com.android.internal.app.AlertController.installContent(AlertController.java:215) 
at android.app.AlertDialog.onCreate(AlertDialog.java:251) 
at android.app.Dialog.dispatchOnCreate(Dialog.java:307) 
at android.app.Dialog.show(Dialog.java:225) 
at android.app.AlertDialog$Builder.show(AlertDialog.java:823) 
+0

顯示您的完整代碼 – waqaslam 2012-03-18 01:41:38

+0

您想查看更多內容嗎?所有代碼都在那裏,從Activity.onCreate() – 2012-03-18 02:35:23

+0

調用它可以在模擬器或其他設備上正常運行嗎? – waqaslam 2012-03-18 02:36:50

回答

0

ArrayIndexOutOfBoundsException是當你迭代或者試圖訪問數組/一些指標列表,它是不是數組/列表的大小/ lenght中拋出。

在你的情況下,也許處理數組的任何其他代碼。如果存在處理數組的任何代碼(檢查引發異常的行),請將其發佈。

另一件事,則setPositiveButton()秒參數更改爲new DialogInterface.onClickListener(){}否則將無法使用:)

+0

其標準/常見做法將'null'設置爲按鈕的聽衆以關閉對話窗口 – waqaslam 2012-03-18 01:54:08

+0

我剛纔建議如果他需要該按鈕用於其他目的除了解除對話。 – 2012-03-18 01:55:35

+0

這沒關係,謝謝。這是完全按照我的意圖:) – 2012-03-18 02:56:11

1

導致異常應該是代碼:

TypedArray.getInt(TypedArray.java:248 )

/** 
* Retrieve the integer value for the attribute at <var>index</var>. 
* 
* @param index Index of attribute to retrieve. 
* @param defValue Value to return if the attribute is not defined. 
* 
* @return Attribute int value, or defValue if not defined. 
*/ 
public int getInt(int index, int defValue) { 
    index *= AssetManager.STYLE_NUM_ENTRIES; 
    final int[] data = mData; 
    final int type = data[index+AssetManager.STYLE_TYPE]; 
    if (type == TypedValue.TYPE_NULL) { 
     return defValue; 
    } else if (type >= TypedValue.TYPE_FIRST_INT 
     && type <= TypedValue.TYPE_LAST_INT) { 
     // vvvvvvvvvvvvvvvvvvvvvv 248 
     return data[index+AssetManager.STYLE_DATA]; 
     // ^^^^^^^^^^^^^^^^^^^^^^ 248 
    } 

    TypedValue v = mValue; 
    if (getValueAt(index, v)) { 
     Log.w(Resources.TAG, "Converting to int: " + v); 
     return XmlUtils.convertValueToInt(
      v.coerceToString(), defValue); 
    } 
    Log.w(Resources.TAG, "getInt of bad type: 0x" 
      + Integer.toHexString(type)); 
    return defValue; 
} 

奇怪的是,有在ScrollView.java沒有getInt()(爲什麼會出現,即使在次滾動型在Dialog?)。此外例外看起來不尋常。你通常會得到Caused by: java.lang.ArrayIndexOutOfBoundsException: length=5; index=12345而不是null

沒有真正的線索有什麼問題。但它也可能實際上被一些自定義佈局東西,因爲getInt造成將通常用於像這樣來查詢視圖屬性

case R.styleable.View_scrollbars: 
    final int scrollbars = a.getInt(attr, SCROLLBARS_NONE); 
    if (scrollbars != SCROLLBARS_NONE) { 
     viewFlagValues |= scrollbars; 

我會說這是一個自定義固件或一些軟件的修改由三星完成,是造成這個。

+0

對話框消息文本實際上是大約7行(現在編輯了原始問題),所以這將解釋爲什麼有一個ScrollView。此外,ScrollView擴展FrameLayout,我看到FrameLayout構造函數調用TypedArray.getInt(),以便可以相關... ... – 2012-03-18 02:42:50

+0

ScrollView始終存在[alert_dialog.xml](http://grepcode.com/file_/repository.grepcode .com/java/ext/com.google.android/android/2.3.6_r1/frameworks/base/core/res/res/layout/alert_dialog.xml /?v = source)當你提供短文本時它不會滾動。 – zapl 2012-03-18 02:55:54

1

在構造函數時,框架使用TypedArray從用於膨脹視圖的xml佈局中檢索xml數據。標準的android在ScrollView的構造函數時沒有檢索int,所以它看起來像samsung修改了框架的一部分。 (無論如何,它應該在try/cacth/finally塊中,所以他們在那裏做得不好)。您看到的ScrollView是在這些設備的默認對話框實現中出現的那個(通常,對話框的所有內容都應該位於滾動視圖的內部,以防其不適合屏幕,特別是橫向模式)。 您可以嘗試膨脹自己的視圖並使用對話框構建器的setView進行設置。

View content = View.inflate(context, R.layout.my_view_content,null); 
      TextView message = (TextView)content.findViewById(R.id.my_message); 
      message.setText("my message which has about 7 lines and each line is short"); 
      new AlertDialog.Builder(context) 
      .setTitle("my title") 
      .setView(content) 
      .show(); 
+1

謝謝,但看着源:https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/FrameLayout.java它似乎ScrollView的構造函數調用FrameLayout的構造函數,確實調用TypedArray.getInt()方法 - 我在另一個評論中提到了這一點。而且這也不會使用try-catch-finally。 – 2012-03-18 03:38:22

+0

我寧願找出究竟是什麼導致了這個問題,而不是使用這種解決方法,因爲核心原因可能會在各種其他地方出現。 – 2012-03-18 04:19:03

+0

是的,ScrollView擴展了FrameLayout,但是如果它是FrameLayout中的getInt導致異常,它將顯示在StackTrace中;而不是你在ScrollView上發佈的降壓停止。這是一個非常奇怪的事情,因爲它看起來像那些設備ScrollView壞了,我很難相信。你看到很多錯誤的發生? – sciutand 2012-03-18 07:35:01

相關問題