具有自定义样式的 TextView 导致奇怪的膨胀异常

Posted

技术标签:

【中文标题】具有自定义样式的 TextView 导致奇怪的膨胀异常【英文标题】:TextView with custom style causing strange inflate exception 【发布时间】:2015-03-01 03:26:36 【问题描述】:

我正在开发一个 android 项目,并且正在创建一个自定义列表视图。列表视图包含多个文本视图,我正在为我的文本视图创建一种样式,因此我不必一遍又一遍地复制相同的样式。

下面是我的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_
    android:layout_>
    <TextView android:id="@+id/txtFirstOccurred"
        android:layout_
        android:layout_
        android:layout_weight="1"
        style="@style/CrashGroup"/>

    <TextView android:id="@+id/txtLastOccurred"
        android:layout_
        android:layout_
        android:layout_weight="1"
        style="@style/CrashGroup"/>
</LinearLayout>

下面是我的 textview 风格

<style name="CrashGroup">
        <item name="android:singleLine">false</item>
        <item name="android:textSize">@android:style/TextAppearance.Small</item>
        <item name="android:gravity">center_vertical</item>
    </style>

下面是我如何膨胀我的 XML 以显示在我的列表视图中。

@Override
    public View getView(int position, View convertView, ViewGroup parent)
    
        try
        
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.android_crash_group_layout, null);

            TextView txtFirstOccurred = (TextView)convertView.findViewById(R.id.txtFirstOccurred);
            txtFirstOccurred.setText(getItem(position).getFirstOccurred());

            TextView txtLastOccurred = (TextView)convertView.findViewById(R.id.txtLastOccurred);
            txtLastOccurred.setText(getItem(position).getLastOccurred());


            return convertView;
        
        catch (Exception ex)
        
            Log.e(TAG, ex.toString());
            return null;
        
    

我得到的错误是:

进程:com.BoardiesITSolutions.CritiMonApp,PID:1451 java.lang.NullPointerException:尝试在 null 上调用虚拟方法“int android.view.View.getImportantForAccessibility()” 对象引用 在 android.widget.AbsListView.obtainView(AbsListView.java:2360) 在 android.widget.ListView.makeAndAddView(ListView.java:1864) 在 android.widget.ListView.fillDown(ListView.java:698) 在 android.widget.ListView.fillFromTop(ListView.java:759) 在 android.widget.ListView.layoutChildren(ListView.java:1673) 在 android.widget.AbsListView.onLayout(AbsListView.java:2148) 在 android.view.View.layout(View.java:15596) 在 android.view.ViewGroup.layout(ViewGroup.java:4966) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 在 android.view.View.layout(View.java:15596) 在 android.view.ViewGroup.layout(ViewGroup.java:4966) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 在 android.view.View.layout(View.java:15596) 在 android.view.ViewGroup.layout(ViewGroup.java:4966) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:508) 在 android.view.View.layout(View.java:15596) 在 android.view.ViewGroup.layout(ViewGroup.java:4966) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:508) 在 android.view.View.layout(View.java:15596) 在 android.view.ViewGroup.layout(ViewGroup.java:4966) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 在 android.view.View.layout(View.java:15596) 在 android.view.ViewGroup.layout(ViewGroup.java:4966) 在 android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:890) 在 android.view.View.layout(View.java:15596) 在 android.view.ViewGroup.layout(ViewGroup.java:4966) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:508) 在 android.view.View.layout(View.java:15596) 在 android.view.ViewGroup.layout(ViewGroup.java:4966) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:508) 在 android.view.View.layout(View.java:15596) 在 android.view.ViewGroup.layout(ViewGroup.java:4966) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:508) 在 android.view.View.layout(View.java:15596) 在 android.view.ViewGroup.layout(ViewGroup.java:4966) 在 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 在 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 在 android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 在 android.view.View.layout(View.java:15596) 在 android.view.ViewGroup.layout(ViewGroup.java:4966) 在 android.widget.FrameLayout.layoutChildren(FrameLayout.java:573) 在 android.widget.FrameLayout.onLayout(FrameLayout.java:508) 在 android.view.View.layout(View.java:15596) 在 android.view.ViewGroup.layout(ViewGroup.java:4966) 在 android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2072) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1829) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 在 android.view.Choreographer.doCallbacks(Choreographer.java:580) 在 android.view.Choreographer.doFrame(Choreographer.java:550) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)

这似乎与样式有关,好像我从文本视图中删除了此样式属性,它似乎工作正常。

【问题讨论】:

如果你捕捉到你的异常并返回null,那么异常是什么?显示 logcat:catch (Exception ex) Log.e(TAG, ex.toString()); return null; catch 日志没有提供任何有用的信息。它的android.view.InflateException: Binary XML file line #6: Error inflating class &lt;unknown&gt; LayoutInflater.from(getContext()).inflate(R.layout.android_crash_group_layout, null); 你不应该使用parent 而不是null 和第三个参数false 你能不能用你的 TextView 的完整样式编辑你的帖子 ViewHolder 模式,请。 【参考方案1】:

我认为您返回的 convertView 有时是 null,因为处理 convertView 很棘手。

确保你有一个价值。你可以像这样使用:

 @Override
  public View getView(int position, View convertView, ViewGroup parent) 
    LayoutInflater inflater = (LayoutInflater) context
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    TextView text = null;

    if (convertView == null) 
      convertView = inflater.inflate(R.layout.listrow_details, null);
    

    text = (TextView) convertView.findViewById(R.id.textView1);
    text.setText(children);

    return convertView;
  

希望对你有帮助。

【讨论】:

【参考方案2】:

android:textSize 必须是尺寸值 所以换成这样的样式,

<style name="CrashGroup" parent="@android:style/TextAppearance.Small">
        <item name="android:singleLine">false</item>
        <item name="android:gravity">center_vertical</item>
    </style>

【讨论】:

以上是关于具有自定义样式的 TextView 导致奇怪的膨胀异常的主要内容,如果未能解决你的问题,请参考以下文章

Android:自定义 TextView 膨胀异常

Android中自定义TextView的样式

创建自定义视图的步骤

多个字体到单个自定义 TextView

具有自定义颜色属性的 TextView 不在布局预览中呈现

自定义带边框TextView--边框粗细不一的问题