2013-02-28 68 views
1

我添加按钮,同时运行时将LinearLayout(垂直方向)...如何在以编程方式添加到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 
+1

见我对编辑当父母被给予时,膨胀返回一个ViewGroup。 – nmw 2013-02-28 17:40:51

回答

4

layout_margin将当布局被膨胀,由于存在被在实例化时没有父的ViewGroup被忽略。该框架不能创建布局参数,因为它不知道父ViewGroup类型。

为了解决这个问题,您可以:

1/创建布局编程PARAMS太多,只需添加视图之前,您可以设置margin这些。

2/一个的ViewGroup参数添加到getButton助洗剂和传递mButtonsLayout。然后当你膨胀的XML使用它作为父ViewGroup(inflate()上的最后一个参数)。

使用方法2/充气()将返回的ViewGroup不是视图(在你的情况下按钮),所以你需要使用parent.getChildAt(parent.getChildCount()-1)得到巴顿出的ViewGroup的。

查看LayoutInflater docs充气。


编辑:

请记住该生成器将不再作为一个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. 
0

尝试是这样的:

FrameLayout.LayoutParams layoutParams = 
    new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
           LayoutParams.WRAP_CONTENT); 
layoutParams.setMargins(0, 0, 0, 0); 
mButtonsLayout.setLayoutParams(layoutParams); 
+0

这会导致'java.lang.ClassCastException:android.widget.LinearLayout $ LayoutParams不能转换为android.widget.FrameLayout $ LayoutParams'。 – JJD 2013-02-28 17:38:25

+0

更新了我的答案。请。检查。 – lokoko 2013-02-28 18:47:56

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); 
相关问题