在CustomdArray上为customView获取getString的空指针异常

时间:2012-09-30 14:27:09

标签: android nullpointerexception android-custom-view typed-arrays

我创建了一个新的自定义视图,用于替换linearLayout的权重机制。我添加了一些样式属性,可以在布局xml文件中直接使用。

attrs.xml文件包含:

<resources>
  <declare-styleable name="WeightedLayout_LayoutParams">
    <attr name="horizontalWeights" format="string" />
    <attr name="verticalWeights" format="string" />
  </declare-styleable>
</resources>

可以看到示例和完整代码here。我面临的问题是,在可视化编辑器中,我一直得到一个空指针异常,我从typedArray中获取字符串:

final TypedArray arr=context.obtainStyledAttributes(attrs,R.styleable.WeightedLayout_LayoutParams);
//...
final String horizontalWeights=arr.getString(R.styleable.WeightedLayout_LayoutParams_horizontalWeights);

奇怪的是,如果我运行应用程序,它运行正常(除了我在原始线程中报告的奇怪错误)。我试图修改code of RomainGuy that has made a flowLayout,我也注意到同样的行为也出现了。

任何人都可以告诉我应该怎么做?怎么会不起作用?

2 个答案:

答案 0 :(得分:2)

最后我找到了答案,通过查看Android代码:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/widget/TextView.java?av=f

为了获取文本,您需要查看所有属性并使用getText,例如:

final TypedArray a=getContext().obtainStyledAttributes(attrs,R.styleable.WeightedLayout_LayoutParams);
int indexCount=a.getIndexCount();
for(int i=0;i<indexCount;++i)
  {
  final int attr=a.getIndex(i);
  if(attr==R.styleable.WeightedLayout_LayoutParams_horizontalWeights)
    _textToShow=a.getText(attr);
  }
a.recycle();

答案 1 :(得分:1)

你应该在赋值之前检查 TypedArray.hasValue() :

final TypedArray arr = context.obtainStyledAttributes(attrs,R.styleable.WeightedLayout_LayoutParams);
//...
if (arr.hasValue(R.styleable.WeightedLayout_LayoutParams_horizontalWeights)) {
final String horizontalWeights = arr.getString(R.styleable.WeightedLayout_LayoutParams_horizontalWeights);
}