2

LinearLayout実行中にボタンを(垂直方向)に追加します...

private void addButtons(String[] titles) {
    for (String title : titles) {
        Button button = ButtonBuilder.getButton(getActivity());
        button.setText(title);
        mButtonsLayout.addView(button);
    }
}

各ボタンには、XML で定義されたスタイルがあります。

<!-- styles.xml -->
<style name="Button">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:gravity">center</item>
    <item name="android:layout_margin">8dp</item>
</style>

layout_marginすべてのボタンを間隔なしで隣り合わせに配置するように定義しましたが。それらの間にマージンスペースを追加するにはどうすればよいですか?


nmwで示唆されているように、親レイアウトをインフレータに導入しようとしています。

private void addButtons(String[] titles) {
    for (String title : titles) {
        Button button = ButtonBuilder.getButton(getActivity(), mButtonsLayout);
        button.setText(title);
        mButtonsLayout.addView(button);
    }
}

..

// ButtonBuilder.java
public static Button getButton(Activity activity, ViewGroup parent) {
    return (Button)activity.getLayoutInflater().inflate(R.layout.custom_button, 
                                                        parent);
}

これにより、例外が発生します..

java.lang.ClassCastException: android.widget.LinearLayout cannot be \
   cast to android.widget.Button
4

3 に答える 3

5

インスタンス化時に親ViewGroupがないため、レイアウトが拡張されると、layout_marginは無視されます。フレームワークは、親のViewGroupタイプを認識していないため、レイアウトパラメータを作成できません。

これを修正するには、次のいずれかを実行できます。

1 /レイアウトパラメータもプログラムで作成します。ビューを追加する直前に、それらにマージンを設定できます。

また

2 / ViewGroupパラメーターをgetButtonビルダーに追加し、mButtonsLayoutを渡します。次に、XMLを拡張するときに、それを親ViewGroup(inflate()の最後のパラメーター)として使用します。

メソッド2/ inflate()を使用すると、ビュー(この場合はボタン)ではなくビューグループが返されるため、を使用してボタンをビューグループから取得する必要がありますparent.getChildAt(parent.getChildCount()-1)

膨らませるには、 LayoutInflaterのドキュメントを参照してください。


編集:

Builderはメソッドとして機能しなくなることに注意してくださいgetButton()。ViewGroupパラメーターを使用すると、ボタンはすぐに親ビューに追加されます。

public static Button addButton(Activity activity, ViewGroup parent) {
    activity.getLayoutInflater().inflate(R.layout.custom_button, parent);
    return (Button) parent.getChildAt(parent.getChildCount() - 1);
}

したがって、メインクラスにビューを追加することはできなくなります。

// mButtonsLayout.addView(button); // Remove this

そうしないと、次のエラーが発生します。

java.lang.IllegalStateException: The specified child already has a parent. \
    You must call removeView() on the child's parent first.
于 2013-02-28T17:12:04.533 に答える
0

次のようなことを試してください:

FrameLayout.LayoutParams layoutParams = 
   new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                                 LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0, 0, 0, 0);
mButtonsLayout.setLayoutParams(layoutParams);
于 2013-02-28T17:18:21.980 に答える
0

これを使用してマージンを動的に送信します

MarginLayoutParams marginParams = new MarginLayoutParams(backToMainScreenImageView.getLayoutParams());
marginParams.setMargins(0, 0, (int) UIUtil.getRadialButtonMainMargin(this), 0);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(marginParams);
backToMainScreenImageView.setLayoutParams(layoutParams);
于 2013-02-28T17:53:20.490 に答える