バックグラウンド:
GridView
HTML のように列スパンと行スパンを実装する必要があるものを拡張する方法を探しています。何百もの要素があるため、たとえば a を使用できませんTableLayout
。しかし、それではローカライズされすぎます。これまでのところ、GridView を拡張する方法について質問を減らしましたか?
私が試したことと失敗した場所:
私の最初のアプローチは、どのメソッドを置き換える必要があるかを調べることでした。その結果、オーバーライドできないプライベート メソッドがいくつか見つかりました。そこで、穴のソース コードを からCustomGridGridView
という新しいクラスにコピーしようとしました。クラスにアクセスできないため、これはひどい失敗でした。com.android.internal.R
次に、その考えを捨てて、クラスを通常どおり拡張し、すべてのプライベート メソッドをカスタム コピーに置き換えることができるかどうかを調べました。私はペンを取り、すべてのメソッドが使用される巨大なツリーを構築しました。
すべての参照を見つけた後、クラスを通常に拡張しようとし、最初のメソッドを追加しました。
private View fillDown(int pos, int nextTop) {
View selectedView = null;
int end = (mBottom - mTop);
if((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) {
end -= mListPadding.bottom;
}
// ...
メンバー変数mBottom
とmTop
が不明であるという私の次の問題は次のとおりです。ソースを少し掘り下げて、最終的にView
クラスで見つけましたが、残念ながらそれらは隠されています.
/**
* The distance in pixels from the top edge of this view's parent
* to the bottom edge of this view.
* {@hide}
*/
@ViewDebug.ExportedProperty(category = "layout")
protected int mBottom;
質問:
GridView
その嘆きを打たず、大規模な反射を使用せずに、どうすれば拡張できますか? つまり、それを純粋なカスタム コントロールとして記述することは不可能のようです。