Android - 通过构造函数编程按钮编程按钮有问题

时间:2013-07-16 14:50:24

标签: android android-layout android-linearlayout

我知道Style的工作原理正是我之前使用的Style,尽管是XML。我正在做的一个简单的例子(不工作)..

LinearLayout buttonlayout = (LinearLayout) dialogLayout.findViewById(R.id.layout_menu_buttons);

Button bSettings = new Button(getActivity(), null, R.style.button_menu);

buttonlayout.addView(bSettings);

我在XML中完美地工作,我能够创建没有样式的按钮没有问题(这很有效,但没有让我动态应用样式)..

Button bSettings = new Button(getActivity());
    bSettings.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

完整代码:

    // Getting reference to the Menu layout
    LinearLayout buttonlayout = (LinearLayout) dialogLayout.findViewById(R.id.layout_menu_buttons);
    buttonlayout.removeAllViewsInLayout();

    // Dynamically create buttons       
    Button bSettings = new Button(getActivity(), null, R.style.button_menu);        
    Button bHelp = new Button(getActivity(), null, R.style.button_menu);        
    Button bHistory = new Button(getActivity(), null, R.style.button_menu);     
    Button bAbout = new Button(getActivity(), null, R.style.button_menu);

    // Adding to Layout
    buttonlayout.addView(bSettings);
    buttonlayout.addView(bHelp);
    buttonlayout.addView(bHistory);
    buttonlayout.addView(bAbout);

button_menu style ..

<style name="button_menu" parent="@style/Fill.Width">
    <item name="android:background">@drawable/selector_example1_button_background</item>
    <item name="android:layout_margin">10dp</item>
    <item name="android:padding">30dp</item>
</style>

注意:我已经使用DDMS转储视图进行了检查,发现所有按钮都在那里,它们都有正确的文本等。我​​只是看不到它们,它们似乎实际上并没有使用任何样式中包含的属性。

我也尝试在设置没有区别的样式后再次设置LayoutParams。

有点困惑......

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

问题是你是通过创建一个新的布局params对象并覆盖视图上现有的布局参数来打破布局参数。

LinearLayout buttonLayout;
Button testV = new Button(this, null, R.style.button_menu);
Button testV2 = new Button(this, null, R.style.button_menu);
buttonLayout.addView(testV);
buttonLayout.addView(testV2);

LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) testV.getLayoutParams();
//we cast to linearLayout params because we're putting this view in a linearLayout
layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
layoutParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
testV2.setLayoutParams(layoutParams);

在这个例子中,我们正在创建一个带有样式的新Button,然后从它获取params并改变我们想要的东西(由于对象如何工作,我们不必将它设置回来自哪里),现在是第二个按钮(testV2),因为它基于与testV相同的样式(因此也就是layoutParams),我们可以将testV2的布局参数设置为与testV相同。

答案 1 :(得分:0)

结束创建一个按钮模板,每个模板都有当前主题选择的任何样式,然后膨胀该XML布局..

Button b = (Button) getLayoutInflater().inflate(R.layout.styled_button, null);

然后通过更改主题,您可以更改按钮的样式。请参阅此问题以获得一个好例子Dynamically change theme and therefore widget style