1

getNumColumns()forGridViewはAPI11以降で利用可能ですが、API 8でこのメソッドを取得する方法はありますか?

4

4 に答える 4

7

この複製された投稿で、誰かがAPI8で機能する答えを持ってきました:

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())というフィールドが既にあります。彼らはおそらくフィールド名を別のものに変更してからAPI8と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であるため、エラーは発生しません。

また、(@ elguiの回答のように)別の方法を使用する代わりに、このようにすることの反対の推奨事項があるかどうかもわかりませんが、このgetNumColumnsCompat()ようにかなりきれいであることがわかりました。

于 2014-06-14T19:52:15.553 に答える
1

これはおそらく聞きたい答えではありませんが、GridViewAPI8で利用可能なものに適合するAPI11機能を備えたカスタムを作成する必要があります。

于 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 に答える