2013-02-28 72 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); 
相關問題