web-dev-qa-db-ja.com

LayoutParamsオブジェクトのプロパティを変更した後、もう一度setLayoutParamsを呼び出す必要がありますか?

特定の時点(広告が読み込まれた後)で画面の幅に合わせて拡大縮小する必要があるビュー(広告を含む)があります。だから私は与えられたスクリーン幅の正しい高さを計算し、それに応じてビューのLayoutParamsを変更するメソッドsetHeight(myView)を持っています。コードの重要な部分はこれです:

_LayoutParams params = myView.getLayoutParams();
int width = myView.getWidth();
if (params != null && width > 0) {
    params.height = (int) Math.round(ratio * width);
}
_

これはほとんどの部分で機能するようですが、ビューが拡大縮小されない場合があります。一番下に次の行を追加した場合のみ、一貫して機能するようです。

_myView.setLayoutParams(params);
_

AndroidビューはrequestLayout()メソッドでsetLayoutParams()を呼び出すため、これも理にかなっているようです。逆に、パブリックフィールド(_params.height_)は、レイアウトの変更をトリガーします。

一方で、ネット上で繰り返しパラメータを変更するチュートリアルを繰り返し見かけ、その後、ビューに設定されません。

したがって、私の質問は次のとおりです。LayoutParamsのプロパティを変更した直後にレイアウトを更新するには、もう一度setLayoutParamsを呼び出す必要がありますか?そして、単にプロパティを変更すると、レイアウトの変更が他の場所からトリガーされた後の時点でのみレイアウトが変更されますか?

26
david.mihola

レイアウトパラメータの変更は、次のレイアウトパスでのみ有効になります。

  • requestLayout()はレイアウトパスをスケジュールします

  • setLayoutParams()requestLayout()を呼び出します

  • レイアウトパスは他の方法でスケジュールされる場合があります。たとえば、インフレーションの直後に、レイアウトパラメーターもインフレートされ、測定/レイアウトメッセージが、後の処理のためにUIスレッドメッセージキューにポストされました。

安全のため、レイアウトパラメータに触れた後は常にrequestLayout()を呼び出してください。 setLayoutParams()も機能しますが、パラメーターをインプレースで変更する場合は必ずしも必要ではありません。

42
laalto