1

我在三星 Galaxy S II (GT-I9100G) 和三星 NTT DOCOMO Galaxy S II LTE (SC-03D) 上看到了这一点。

我正在建造 14 级,目标是 10 级(最低 3 级)。

我认为这与主题有关,但不知道从哪里开始。我很确定它不会发生在所有 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)
4

3 回答 3

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

奇怪的是里面没有getInt()ScrollView.java为什么那个Dialog里竟然还有一个ScrollView?)。异常看起来也不寻常。你通常会得到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;

我会说这是导致此问题的自定义固件或三星所做的一些软件修改。

于 2012-03-18T02:09:59.073 回答
1

在构造函数时,框架使用 TypedArray 从用于扩充视图的 xml 布局中检索 xml 数据。标准 android 在 ScrollView 的构造函数期间不会检索 int,因此看起来三星修改了框架的那部分。(它应该在 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();
于 2012-03-18T03:16:25.337 回答
0

ArrayIndexOutOfBoundsException当您迭代或尝试访问不在数组/列表大小/长度范围内的数组/列表中的某个索引时抛出。

在您的情况下,可能是处理数组的任何其他代码。如果存在任何处理数组的代码(检查引发异常的行),请发布。

另一件事,将setPositiveButton()第二个参数更改为new DialogInterface.onClickListener(){}否则它将无法使用:)

于 2012-03-18T01:47:18.243 回答