1

我知道样式可以正常工作,因为它正是我之前使用的样式,尽管是在 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 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。

对此有点困惑。。

有任何想法吗?

4

2 回答 2

0

最终创建了一个按钮模板,每个模板都具有当前主题选择的任何样式,然后扩展了该 XML 布局..

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

然后通过更改主题,更改按钮的样式。请参阅此问题以获取一个很好的示例动态更改主题并因此更改小部件样式

于 2013-07-17T08:35:13.660 回答
0

问题是您通过创建新的布局参数对象并覆盖视图上的现有布局参数来破坏布局参数。

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 样式,然后从中获取参数并更改我们想要的(由于对象的工作方式,我们不必将其设置回它的来源)现在在第二个按钮的情况下(testV2) 因为它基于与 testV 相同的样式(因此 layoutParams 也是如此),我们可以将 testV2 的布局参数设置为与 testV 相同。

于 2013-07-16T15:06:11.433 回答