我有一个Android应用程序@Android Market。我不断收到一些声称某些用户获得NullPointerException的崩溃报告。
我找到了似乎导致此问题的代码。
它位于ArrayAdapters getView方法中。
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.subcatategory_row, null);
holder = new ViewHolder();
v.setTag(holder);
}
else {
holder=(ViewHolder)v.getTag();
if(holder == null){
holder = new ViewHolder();
}
}
TextView tl = (TextView) v.findViewById(R.id.label);
tl.setTextAppearance(getContext(), R.style.styleA);
此代码段中的最后一行似乎导致了崩溃。但是我从来没有经历过它,我一直在几台设备上进行测试。
非常感谢帮助!!
编辑:
subcategory_row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row_layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="0dip"
android:background="@drawable/background"
android:weightSum="80">
<TextView
android:id="@+id/label"
android:layout_weight="9"
android:layout_width="0dip"
android:layout_height="fill_parent"
android:layout_marginRight="6dip"
android:gravity="center_vertical|center"
android:text="C.r"
android:textSize="12sp"
android:textColor="@color/default_textcolor"
/>
<LinearLayout
android:orientation="vertical"
android:layout_width="0dip"
android:layout_weight="53"
android:layout_height="fill_parent">
<TextView
android:id="@+id/text_bb"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:layout_marginLeft="4dip"
android:gravity="bottom"
android:textSize="13sp"
android:textColor="@color/default_textcolor"
android:ellipsize="end" android:singleLine="true"/>
<TextView
android:id="@+id/text_ba"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:layout_marginLeft="4dip"
android:gravity="top"
android:textSize="13sp"
android:textColor="@color/default_textcolor"
android:ellipsize="end" android:singleLine="true"/>
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="0dip"
android:layout_weight="8"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/text_a"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:gravity="bottom|right"
android:textSize="13sp"
android:text="0"
android:textColor="@color/default_textcolor"
/>
<TextView
android:id="@+id/text_b"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:gravity="top|right"
android:textSize="19sp"
android:text="0"
android:textColor="@color/default_textcolor"
/>
</LinearLayout>
<LinearLayout
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|right"
android:layout_weight="10"
android:orientation="vertical"
android:paddingLeft="10dp" >
<ImageView
android:id="@+id/arrow"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:paddingLeft="-10dip"
android:paddingRight="10dip"
android:src="@drawable/arrow"
android:visibility="visible" />
</LinearLayout>
</LinearLayout>
答案 0 :(得分:1)
您应该将TextView
存储在ViewHolder对象
这是我用过的一个例子
class DataObjectContainer {
TextView title;
}
public View getView(final Activity activity, View convertView, ViewGroup parent) {
final DataObjectContainer container;
if (convertView == null) {
convertView = (LinearLayout) activity.getLayoutInflater().inflate(R.layout.dataobjectitem, null);
container = new DataObjectContainer();
container.title = (TextView) convertView.findViewById(R.id.textview_title);
convertView.setTag(container);
} else {
container = ((DataObjectContainer) convertView.getTag());
}
container.title.setText(getValueString(DataObject.Table.NAME));
return convertView;
}
答案 1 :(得分:1)
我在已发布的应用上也遇到过此问题。 经过大量的灵魂搜索,我以两种不同的方式重新创造了它!
原因1)原因是它为空,是因为当时没有内存来分配它。只需编写更多保护代码并关闭。
原因2)Dalvik在某些情况下确信我没有使用它并取消分配它。我不得不改变我的代码,以确保它在Dalvik眼中更加“迷惑”。
然而,10次中有9次,原因是1。
问题在于,当您使用测试设备时无法重现它,其他人会同时运行各种各样的东西。