6

ViewGroup中にいくつかのビューがあるカスタムがあります。

イベントに応答して、requestLayoutが呼び出され、OnLayout一部のビューで新しいレイアウト位置が取得されます。

それらの1つはその位置を維持しますが、内部で再配置する必要があります。ただし、このビューのonlayoutメソッドは、レイアウト位置が変更されないため呼び出されません。requestLayoutforceLayoutまたはこのビューで電話をかけようとしてもinvalidate機能しません。

私が見つけた唯一の汚いトリックは、レイアウトの変更を強制するためにその値の位置の一部を変更することですが、もっと良い方法があるはずだと思います。だから、今では私は次のような(恐ろしい)何かをします:

    int patch = 0;
    @Override protected void onLayout(boolean changed, int l, int t, int r, int b) {
        ...
        _myView.patchedLayout(patch);
        _myview.layout(l1, t1 , r1, t1+patch);
        patch = (patch+1) % 2;
        ...
    }       

より良い方法で同じ結果を得る方法はありますか?

4

1 に答える 1

4

私はついに解決策を得ました:私はオーバーライドする必要があり、私の見解でonMeasure必ず呼び出す必要があります:mesure

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    ...
    _myview.measure(widthMeasureSpec, heightMeasureSpec);
    ...

ビューのプライベートフィールドmPrivateFlagsにLAYOUT_REQUIREDフラグが設定されるため、強制的に呼び出すようになります。onLayout

于 2012-07-05T16:37:11.167 に答える