特定の時点(広告が読み込まれた後)で画面の幅に合わせて拡大縮小する必要があるビュー(広告を含む)があります。だから私は与えられたスクリーン幅の正しい高さを計算し、それに応じてビューの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
を呼び出す必要がありますか?そして、単にプロパティを変更すると、レイアウトの変更が他の場所からトリガーされた後の時点でのみレイアウトが変更されますか?
レイアウトパラメータの変更は、次のレイアウトパスでのみ有効になります。
requestLayout()
はレイアウトパスをスケジュールします
setLayoutParams()
はrequestLayout()
を呼び出します
レイアウトパスは他の方法でスケジュールされる場合があります。たとえば、インフレーションの直後に、レイアウトパラメーターもインフレートされ、測定/レイアウトメッセージが、後の処理のためにUIスレッドメッセージキューにポストされました。
安全のため、レイアウトパラメータに触れた後は常にrequestLayout()
を呼び出してください。 setLayoutParams()
も機能しますが、パラメーターをインプレースで変更する場合は必ずしも必要ではありません。