【问题标题】:TextView styles ArrayIndexOutOfBoundsExceptionTextView 样式 ArrayIndexOutOfBoundsException
【发布时间】:2014-01-08 13:29:05
【问题描述】:

我在 PlayStore 的管理控制台中经常出现崩溃。我不明白为什么它会崩溃。 我从来没有重现过这个崩溃,它似乎只来自三星 Galaxy 设备(虽然不太确定)。从 sdk 版本 4.1 & 4.2 & 4.3

这是完整的 StackTrace:

android.view.InflateException: Binary XML file line #31: Error inflating class <unknown>
at android.view.LayoutInflater.createView(LayoutInflater.java:613)
at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at com.android.internal.widget.ActionBarContextView.initClose(ActionBarContextView.java:262)
at com.android.internal.widget.ActionBarContextView.onConfigurationChanged(ActionBarContextView.java:136)
at android.view.View.dispatchConfigurationChanged(View.java:7761)
at android.view.ViewGroup.dispatchConfigurationChanged(ViewGroup.java:1056)
at android.view.ViewGroup.dispatchConfigurationChanged(ViewGroup.java:1060)
at android.view.ViewGroup.dispatchConfigurationChanged(ViewGroup.java:1060)
at android.view.ViewGroup.dispatchConfigurationChanged(ViewGroup.java:1060)
at android.view.ViewGroup.dispatchConfigurationChanged(ViewGroup.java:1060)
at android.view.ViewRootImpl.updateConfiguration(ViewRootImpl.java:2800)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1509)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4464)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
at android.view.Choreographer.doCallbacks(Choreographer.java:555)
at android.view.Choreographer.doFrame(Choreographer.java:525)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4895)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:417)
at android.view.LayoutInflater.createView(LayoutInflater.java:587)
... 31 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=24; index=691
at android.content.res.StringBlock.get(StringBlock.java:64)
at android.content.res.XmlBlock$Parser.getPooledString(XmlBlock.java:458)
at android.content.res.TypedArray.loadStringValueAt(TypedArray.java:720)
at android.content.res.TypedArray.getString(TypedArray.java:124)
at android.widget.TextView.<init>(TextView.java:916)
at android.widget.TextView.<init>(TextView.java:562)
... 34 more

我在想这可能是由我给 TextView 的样式引起的(特别是 fontFamily)。所以这是我的 values-v16 > styles.xml (values-v16) 中的一个样式:

 <style name="TextViewHour">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_marginLeft">5dip</item>
        <item name="android:ellipsize">end</item>
        <item name="android:maxLines">1</item>
        <item name="android:textSize">@dimen/text_hour_size</item>
        <item name="android:textColor">@color/item_hour</item>
        <item name="android:fontFamily">sans-serif-condensed</item>
        <item name="android:textStyle">bold</item>
    </style>

从值>styles.xml

 <style name="TextViewHour">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_marginLeft">5dip</item>
        <item name="android:ellipsize">end</item>
        <item name="android:maxLines">1</item>
        <item name="android:textSize">@dimen/text_hour_size</item>
        <item name="android:textColor">@color/item_hour</item>
        <item name="android:textStyle">bold</item>
    </style> 

这里是使用 TextView 的示例:

<TextView
    style="@style/TextViewHour"
    android:id="@+id/name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="@color/item_date_separator"/>

我不知道为什么我的应用会在某些设备上崩溃。 因此,如果有人有想法,我会全力以赴!

编辑:似乎不仅在 Galaxy 设备上,我也遇到了 Nexus 7 崩溃。

【问题讨论】:

  • 我还在我的产品应用程序中看到了几次崩溃。我下载了机器人字体并将它们加载到应用程序中,但我忘记从我的一些样式中删除“fontFamily”。我现在删除了它们,并将很快推送 apk,如果崩溃停止,我会通知您。

标签: android android-layout textview android-styles


【解决方案1】:

在我从主题中删除 android:fontFamily 之前,我遇到了同样的崩溃。我注意到您的TextView 中有android:fontFamily

【讨论】:

    【解决方案2】:

    字体 sans-serif-condensed 可能在某些设备上不可用,这就是应用程序崩溃的原因。如果你想支持额外的字体,你可以把它放在你的assets文件夹中,然后可以通过扩展TextView来创建一个CustomTextView

    public class MyTextView extends TextView {
    
    public MyTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }
    
    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    
    public MyTextView(Context context) {
        super(context);
        init();
    }
    
    private void init() {
        Typeface tf = Typeface.createFromAsset(getContext().getAssets(),
                                               "your_font.ttf");
        setTypeface(tf);
    }
    

    }

    在你的 xml 中。

    <com.mypackage.test.MyTextView
     android:id="@+id/txt"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:gravity="center"
     android:layout_weight="1"
     android:text="custom text view. "
     android:textSize="30dip"
     android:textColor="#ff0000"
    >
    

    【讨论】:

    • roboto 字体在所有 android 4.1 + 版本中默认不可用?我的意思是,显然我不是唯一一个在 styles.xml 中使用“font:family”的人。
    • 它可能不会,所以更安全的方法是,如果您愿意提供一些特定的字体/字体,请将其放在应用程序包中并像上面一样使用。
    • 另外,如果你想下载roboto字体,你可以从这里下载。 developer.android.com/design/style/typography.html
    • 是的,在帖子的答案中写道:“您可以像这样从 Android 4.1+ 本地使用 Roboto”。这就是我正在做的事情。
    【解决方案3】:

    我的应用遇到了类似的InflateException,谷歌搜索将我带到了这个帖子。

    对我来说,导致我的 TextView 引发异常的代码是这样的:

    android:textAlignment="viewStart"
    

    重新设计我的布局,因此不需要此条目来解决我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 2017-08-11
      • 2011-03-09
      相关资源
      最近更新 更多