【问题标题】:Android EditText on longPress: ArrayIndexOutOfBoundsException: length=15; index=491longPress上的Android EditText:ArrayIndexOutOfBoundsException:length = 15;索引=491
【发布时间】:2013-05-02 21:11:59
【问题描述】:

我有这种奇怪的行为,我无法解释。 我的布局很简单:一个 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);

    }

}

【问题讨论】:

  • 听起来像是加载项出现故障。你是在模拟器还是实际手机中执行此操作?
  • 在索尼 Xperia Z 上,我现在就试试模拟器。
  • 看起来系统正在尝试创建一个包含 TextView 的 PopupWindow。然后在应用主题时崩溃。您使用自定义主题吗?有什么不寻常的地方吗?
  • 我猜那是复制/粘贴弹出窗口,我使用 Theme.DeviceDefault,我会尝试其他主题...
  • 确实,sans-serif-light 会使 EditText 崩溃。感谢您的帮助,我永远不会自己找到。

标签: android android-edittext


【解决方案1】:

只需从您的自定义样式中删除此行

这一行:

  <item name="android:fontFamily">sans-serif-light</item>

长按会导致EditText崩溃。

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

【讨论】:

  • 没有加载项?这在某种程度上令人失望。它是否也在模拟器中崩溃了?
  • 我遇到了同样的错误,从主题样式标签中删除 fontFamily 标签修复了它。但是,如果我错了,请纠正我,我假设在主题中设置 fontFamily 对子元素没有影响。你必须为 TextViews、EditTexts、Buttons 等创建额外的样式。
  • stackoverflow.com/questions/16404820/… 应用答案是解决此问题的方法。但还要加上&lt;item name="android:editTextStyle"&gt;@style/EditText&lt;/item&gt;和:&lt;style name="EditText" parent="android:Widget.EditText"&gt;&lt;item name="android:fontFamily"&gt;sans-serif-light&lt;/item&gt;&lt;/style&gt;
【解决方案2】:

此链接解决了我的问题,虽然 xml 文件中的自动完成功能不起作用,但此示例中的代码是正确的,我在相同的样式文件中声明了所有内容并且它有效:

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

这就是它所说的:

好像是样式错误,验证一下有没有

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

在您的应用程序主题中,而不是在主题视图中,在应用程序主题中。 同样的错误发生在我身上,直到我删除了我的 style.xml 的这一行,如果你有那一行,删除它们,如果你需要这个属性,你可以用以下方式设置文本视图和按钮的样式:

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

在您的应用主题中,使用:

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

【讨论】:

  • 非常适合我!很好的发现。
【解决方案3】:

我也遇到过这个问题;

但它的原因是我使用了 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);
}

【讨论】:

    【解决方案4】:

    style.xml 中使用&lt;item name="android:fontFamily"&gt;sans-serif&lt;/item&gt; 时遇到这个问题

    崩溃

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

    不会崩溃

    • 三星 S7 Edge (SM-G935F) (7.0)
    • 小米A2 (8.0.1)
    • 像素 XL (8.1.0)
    • 索尼 Xperia Z5 Au (SOV32) (6.0)
    • 箭 NX (F-04G) (6.0.1)
    • 京瓷 (S2) (7.0)

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

    然后我认为 API 可能会导致这个问题,因为当前的崩溃设备 API

    总结:在某些设备上会崩溃

    解决此问题
    首先,删除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-serifRoboto 字体(参见此处Android default font

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多