getNumColumns()
forGridView
从 API 11 开始可用,有什么方法可以在 API 8 中获取此方法?
问问题
2328 次
4 回答
7
在这个重复的帖子中,有人提出了适用于 API 8 的答案:
private int getNumColumnsCompat() {
if (Build.VERSION.SDK_INT >= 11) {
return getNumColumnsCompat11();
} else {
int columns = 0;
int children = getChildCount();
if (children > 0) {
int width = getChildAt(0).getMeasuredWidth();
if (width > 0) {
columns = getWidth() / width;
}
}
return columns > 0 ? columns : AUTO_FIT;
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private int getNumColumnsCompat11() {
return getNumColumns();
}
于 2013-09-12T09:46:34.413 回答
4
我在我的一个自定义 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()
方法(如@elgui 回答),但我发现它像这样非常整洁。
于 2014-06-14T19:52:15.553 回答
1
这可能不是您想听到的答案,但您必须创建一个自定义GridView
' ,它的 API 11 功能与 API 8 中可用的功能相匹配。
于 2013-02-14T16:30:19.727 回答
0
加入最佳答案,然后沸腾:
@SuppressLint("NewApi")
@Override
public int getNumColumns() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
return super.getNumColumns();
try {
Field numColumns = getClass().getSuperclass().getDeclaredField("mNumColumns");
numColumns.setAccessible(true);
return numColumns.getInt(this);
}
catch (Exception e) {}
int columns = AUTO_FIT;
if (getChildCount() > 0) {
int width = getChildAt(0).getMeasuredWidth();
if (width > 0) columns = getWidth() / width;
}
return columns;
}
:D
于 2015-02-23T23:06:00.850 回答