我在运行时将按钮添加到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 的建议,我试图将父布局引入inflater。
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
答案 0 :(得分:5)
layout_margin。框架无法创建布局参数,因为它不知道父ViewGroup类型。
要解决此问题,您可以:
1 / 以编程方式创建布局参数,在添加视图之前,您可以设置边距。
或
2 / 将一个ViewGroup参数添加到getButton构建器并传入mButtonsLayout。然后,当你使用那个XML作为父ViewGroup(inflate()的最后一个参数)。
当使用方法 2 / 时,inflate()将返回ViewGroup而不是视图(在您的情况下为Button),因此您需要使用{{1}将Button从ViewGroup中取出}}
请参阅LayoutInflater docs了解inflate。
修改强>
请注意,构建器将不再用作parent.getChildAt(parent.getChildCount()-1)
方法。使用ViewGroup参数时,按钮会立即添加到父视图。
getButton()
因此,您无法再在主类中添加视图。
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
答案 1 :(得分:0)
尝试这样的事情:
FrameLayout.LayoutParams layoutParams =
new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0, 0, 0, 0);
mButtonsLayout.setLayoutParams(layoutParams);
答案 2 :(得分: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);