web-dev-qa-db-ja.com

XMLで定義された既存のルールをプログラムで削除するにはどうすればよいですか?

相対レイアウト内に含まれる線形レイアウトがあります。 XMLファイルで別の線形レイアウトの右側に設定されます(これは正常に機能します)。場合によっては、アクティビティのonCreate中にレイアウトの相対位置を変更したいので、「右側」のパラメーターを変更して別のレイアウトに関連付ける必要があります。私はこれを試しました:

    RelativeLayout.LayoutParams layoutParams;

    layoutParams = (RelativeLayout.LayoutParams) linearLayoutToMove
            .getLayoutParams();
    layoutParams.addRule(RelativeLayout.RIGHT_OF,
            R.id.new_ref_LinearLayout);

しかし、それは動作しません:o(

手がかりは?

67
Regis St-Gelais

すべてのルールは常に固定サイズJava配列に格納されているため、ルールを削除することはできません。ただし、ルールを0。例えば

layoutParams.addRule(RelativeLayout.RIGHT_OF, 0);
layoutParams.addRule(RelativeLayout.BELOW, R.id.new_ref_LinearLayout);

[〜#〜] edit [〜#〜](おかげで Roger Rapid ):

APIレベル17では、クラスRelativeLayout.LayoutParamsには次のメソッドがあります。

public void removeRule(int verb) 

したがって、次のコード行を使用してルールを削除できます。

layoutParams.removeRule(RelativeLayout.RIGHT_OF);

そして、次のようにゼロルールを「追加」する場合とまったく同じ結果が得られます。

layoutParams.addRule(RelativeLayout.RIGHT_OF, 0);
145
Michael

電話する必要があると思います:

relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);

layoutParamsを変更した後。

編集に応答して、次を使用して新しいLayoutParametersを作成できます。

LinearLayout.LayoutParams = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.FILL_PARENT,
    LinearLayout.LayoutParams.FILL_PARENT);

その後、新しいルールを追加します。次に、前述のupdateViewLayout()メソッドを使用してレイアウトパラメーターを更新します。

3
Matthew Willis

次のコードを既存のコードに追加します

linearLayoutToMove.setLayoutParams(layoutParams)

これでうまくいくと思います。上記の行が機能しない場合は、上記の行の後にlinearLayoutToMove.invalidate()を呼び出してください。

0
Rohit Mandiwal