如何在以编程方式添加到LinearLayout的按钮之间添加边距空间?

JJD*_*JJD 2 android runtime margin android-layout android-linearlayout

我在运行时将按钮添加到LinearLayout(垂直方向)......

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

每个按钮都有一个用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>
Run Code Online (Sandbox Code Playgroud)

虽然我定义了layout_margin所有按钮彼此相邻但没有任何间距.如何在它们之间添加边距?


正如nmw所建议的那样,我试图将父布局引入inflater.

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

..

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

这导致例外..

java.lang.ClassCastException: android.widget.LinearLayout cannot be \
   cast to android.widget.Button
Run Code Online (Sandbox Code Playgroud)

nmw*_*nmw 5

由于在实例化时没有父ViewGroup,布局膨胀时将忽略layout_margin.框架无法创建布局参数,因为它不知道父ViewGroup类型.

要解决此问题,您可以:

1 /以编程方式创建布局参数,在添加视图之前,您可以设置边距.

要么

2 /将一个ViewGroup参数添加到getButton构建器并传入mButtonsLayout.然后当你使用那个XML作为父ViewGroup(inflate()的最后一个参数).

当使用方法2 / inflate()将返回ViewGroup而不是视图(在您的情况下为Button),因此您需要使用View将Button从ViewGroup中取出parent.getChildAt(parent.getChildCount()-1).

请参阅LayoutInflater文档以了解inflate.


编辑:

请注意,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);
}
Run Code Online (Sandbox Code Playgroud)

因此,您无法再在主类中添加视图.

// mButtonsLayout.addView(button); // Remove this
Run Code Online (Sandbox Code Playgroud)

否则会导致以下错误:

java.lang.IllegalStateException: The specified child already has a parent. \
    You must call removeView() on the child's parent first.
Run Code Online (Sandbox Code Playgroud)