因为我最初回答了一个重复的问题,所以在这里添加重复的答案。
我在我的一个自定义 GridView 子类上添加了这个实现,它按预期工作。我检查了 GridView 类的声明字段,至少在 API 8 上,它们确实已经有一个名为的字段mNumColumns(这是 API 18 返回的内容getNumColumns())。他们可能没有将字段名称更改为其他名称,然后又在 API 8 和 18 之间更改,但我没有检查。
@Override
public int getNumColumns() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
return super.getNumColumns();
} else {
try {
Field numColumns = getClass().getSuperclass().getDeclaredField("mNumColumns");
numColumns.setAccessible(true);
return numColumns.getInt(this);
} catch (Exception e) {
return 1;
}
}
}
@Override 不会导致任何错误,因为它只是一个安全检查注释 AFAIK。
我也不知道是否有任何反对建议这样做而不是使用单独的getNumColumnsCompat()方法(如@cottonBallPaws 回答),但我发现它像这样非常整洁。