2

バックグラウンド:

GridViewHTML のように列スパンと行スパンを実装する必要があるものを拡張する方法を探しています。何百もの要素があるため、たとえば 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;
    }

    // ...

メンバー変数mBottommTopが不明であるという私の次の問題は次のとおりです。ソースを少し掘り下げて、最終的に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その嘆きを打たず、大規模な反射を使用せずに、どうすれば拡張できますか? つまり、それを純粋なカスタム コントロールとして記述することは不可能のようです。

4

1 に答える 1

1

その制限にぶつからず、大規模なリフレクションを使用せずに GridView を拡張するにはどうすればよいですか?

ほとんどの場合、そうではありません。コードをプロジェクトにコピーし、必要なすべてのスーパークラス (最大ViewGroup) を含むように変更します。の単純なサブクラスで目的を達成できるとしたら、私は唖然としますGridView。必要なウィジェットを最初から完全に作成する必要がある場合もあります。

com.android.internal.R クラスにアクセスできないため、これはひどい失敗でした。

Rまた、関連するリソースをコピーしてから、独自のリソースを指すように参照を修正する必要があります。

しかし、残念ながらそれらは隠されています。

このデータを取得する他の方法を見つけます。mBottomたとえば、 は に変更できますgetBottom()

于 2013-05-28T10:37:07.740 に答える