Android EditText长按出现问题:ArrayIndexOutOfBoundsException: length=15; index=491

11

我有这个无法解释的奇怪行为。我的布局非常简单:一个EditText:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="10dp" >


        <EditText
            android:id="@+id/etPass"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

</LinearLayout>

当我尝试长按它(以粘贴一些文本)时,我立即遇到了强制关闭和这个错误:

05-08 16:56:16.838: E/AndroidRuntime(12164): FATAL EXCEPTION: main
05-08 16:56:16.838: E/AndroidRuntime(12164): android.view.InflateException: Binary XML file line #17: Error inflating class <unknown>
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.view.LayoutInflater.createView(LayoutInflater.java:613)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.view.LayoutInflater.inflate(LayoutInflater.java:466)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.view.LayoutInflater.inflate(LayoutInflater.java:352)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.widget.Editor$ActionPopupWindow.initContentView(Editor.java:2995)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.widget.Editor$PinnedPopupWindow.<init>(Editor.java:2280)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.widget.Editor$ActionPopupWindow.<init>(Editor.java:2968)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.widget.Editor$ActionPopupWindow.<init>(Editor.java:2968)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.widget.Editor$HandleView.showActionPopupWindow(Editor.java:3189)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.widget.Editor$InsertionHandleView.showWithActionPopup(Editor.java:3416)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.widget.Editor$InsertionPointCursorController.showWithActionPopup(Editor.java:3652)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.widget.Editor.performLongClick(Editor.java:870)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.widget.TextView.performLongClick(TextView.java:7973)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.view.View$CheckForLongPress.run(View.java:17140)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.os.Handler.handleCallback(Handler.java:615)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.os.Handler.dispatchMessage(Handler.java:92)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.os.Looper.loop(Looper.java:213)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.app.ActivityThread.main(ActivityThread.java:4786)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at java.lang.reflect.Method.invokeNative(Native Method)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at java.lang.reflect.Method.invoke(Method.java:511)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at dalvik.system.NativeStart.main(Native Method)
05-08 16:56:16.838: E/AndroidRuntime(12164): Caused by: java.lang.reflect.InvocationTargetException
05-08 16:56:16.838: E/AndroidRuntime(12164):    at java.lang.reflect.Constructor.constructNative(Native Method)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.view.LayoutInflater.createView(LayoutInflater.java:587)
05-08 16:56:16.838: E/AndroidRuntime(12164):    ... 25 more
05-08 16:56:16.838: E/AndroidRuntime(12164): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=15; index=491
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.content.res.StringBlock.get(StringBlock.java:64)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.content.res.XmlBlock$Parser.getPooledString(XmlBlock.java:458)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.content.res.TypedArray.loadStringValueAt(TypedArray.java:720)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.content.res.TypedArray.getString(TypedArray.java:124)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.widget.TextView.<init>(TextView.java:800)
05-08 16:56:16.838: E/AndroidRuntime(12164):    at android.widget.TextView.<init>(TextView.java:450)
05-08 16:56:16.838: E/AndroidRuntime(12164):    ... 28 more

我真的不知道正在发生什么,希望能得到一些帮助!

只是为了明确,我的Activity中没有任何与这个EditText相关的监听器:

import android.app.Activity;
import android.os.Bundle;

public class ProActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_pro);

    }

}

听起来像是插件出现了故障。你是在模拟器还是实际手机上进行操作? - DigCamara
在 Sony Xperia Z 上,我现在将在模拟器上尝试。 - Waza_Be
1
看起来系统正在尝试创建包含TextView的PopupWindow。然后在应用主题时崩溃了。你使用自定义主题吗?有什么不寻常的事情发生吗? - devconsole
我猜那是复制/粘贴弹出窗口,我使用Theme.DeviceDefault主题,我将尝试其他主题... - Waza_Be
1
确实,<item name="android:fontFamily">sans-serif-light</item>会导致EditText崩溃。非常感谢您的帮助,我自己永远找不到这个问题。 - Waza_Be
4个回答

27
请从您的自定义样式中删除此行
这一行:
  <item name="android:fontFamily">sans-serif-light</item>

长按EditText会导致崩溃。

Android复制/粘贴弹出窗口是错误的根本原因。


没有插件?有点失望。模拟器中也崩溃了吗? - DigCamara
我遇到了同样的错误,从主题样式标签中删除fontFamily标签解决了这个问题。然而,如果我错了,请纠正我,我认为在主题中设置fontFamily对子元素没有影响。你必须为TextView、EditText、Button等创建额外的样式。 - Dominic
1
应用 https://dev59.com/SGQn5IYBdhLWcg3w_LXx 上的答案是解决此问题的一种变通方法。但还需要添加 `@style/EditText`和:<style name="EditText" parent="android:Widget.EditText"> <item name="android:fontFamily">sans-serif-light</item> </style> - Steven Green

1
这个链接解决了我的问题,虽然在xml文件中的自动完成没有起作用,但是这个示例代码是正确的,我在同一个样式文件中声明了所有内容,并且它起作用了。

https://github.com/rengwuxian/MaterialEditText/issues/162

以下是其中的内容:

样式似乎出现了错误,请验证您是否有

<item name="android:fontFamily"></item>

在您的应用程序主题中,而不是主题视图中,在应用程序主题中。 直到我删除了我的style.xml中的这一行,我才遇到了相同的错误。如果您有这行,请将其删除,如果您需要此属性,则可以使用以下方式对textviews和buttons进行样式化:
<style name="TextViewStyle" parent="android:Widget.TextView">
    <item name="android:fontFamily">sans-serif-medium</item>
</style>

<style name="ButtonStyle" parent="android:Widget.Holo.Button">
    <item name="android:fontFamily">sans-serif-medium</item>
</style>

And in your app theme, use:

<item name="android:textViewStyle">@style/TextViewStyle</item>
<item name="android:buttonStyle">@style/ButtonStyle</item>

1
对我来说完美运作!真是个好发现。 - ImGreg

0

我也遇到了这个问题;

但它的原因是我使用了ContextThemeWrapper;

以下是我们如何从ContextThemeWrapper获取LayoutInflater

@Override 
public Object getSystemService(String name) {
    if (LAYOUT_INFLATER_SERVICE.equals(name)) {
        if (mInflater == null) {
            mInflater = LayoutInflater.from(mBase).cloneInContext(this);
        }
        return mInflater;
    }
    return mBase.getSystemService(name);
}

从上面的代码块中,我们可以看到它特别处理LayoutInflater,这就是问题的根源。
我的解决方案是:按照以下方式覆盖此方法。
@Override
public Object getSystemService(String name){
    return getBaseContext().getSystemService(name);
}

0

style.xml中使用<item name="android:fontFamily">sans-serif</item>时,我遇到了这个问题。

它会在以下设备上崩溃

  • Samsung S4 (SC-04E) (5.0.1)
  • Samsung Galaxy Node 5 (5.1.1)

但在以下设备上不会崩溃

  • Samsung S7 Edge (SM-G935F) (7.0)
  • Xiaomi A2 (8.0.1)
  • Pixel XL (8.1.0)
  • Sony Xperia Z5 Au (SOV32) (6.0)
  • Arrow NX (F-04G) (6.0.1)
  • Kyocera (S2) (7.0)

起初,我认为这个问题只会发生在Samsung上,但是Samsung S7没有崩溃。

那么我认为这个问题可能是由于当前崩溃的设备API < 6.0引起的。但我不确定,因为我没有太多的设备进行测试。

摘要:在某些设备上会崩溃

要解决此问题
首先,移除sans-serif
然后从https://github.com/google/fonts/tree/master/apache/roboto下载Roboto字体,然后按照https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml中的说明将其添加到项目中。

为什么选择Roboto字体?
当使用sans-serif字体时,您遇到了这个问题对吧? 在Android中,sans-serif字体就是Roboto字体(请参见Android默认字体)。

如果您知道一些可能会崩溃的设备,请编辑我的答案,这可能有助于测试。
希望它能帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接