2012-03-18 42 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

相关问题