如何通过Android中的主题设置任何小部件的宽度/高度

时间:2011-09-07 06:58:28

标签: android themes

我需要在多个屏幕(xmls)中使用具有相同属性(如width,height,textColor,size等)的相同小部件(按钮,editext,textviews)。所以我为各个小部件创建了样式(一个用于按钮,一个用于编辑文本......)我在CustomTheme中定义了所有这些样式。

我的问题是

如果我也在样式中定义布局宽度/高度并简单地给出style =“@ style / myButtonStyle”for xml中的按钮工作正常,即使我没有提到xml中的宽度/高度(可能继承自Style )。

如果我在xml中给出宽度/高度而没有样式道具,只需将我的自定义主题赋予活动就会带来我在主题中指定的所有样式。但我没有提到xml中的宽度/高度,它引发了一个异常,说你已经指定了布局宽度/高度,我已经在样式本身中指定了它。

我的主题文件是

 <style name="Theme.Blue" parent="android:Theme">
 <item name="android:buttonStyle">@style/button222</item>
<item name="android:textViewStyle">@style/text222</item>
<item name="android:editTextStyle">@style/edittext222</item>
</style>

我的button222样式是

 <style name="button222" parent="@android:style/Widget.Button">
<item name="android:layout_width">@dimen/mWidth</item>
<item name="android:textColor">#F56266</item>
<item name="android:textSize">20sp</item>
</style>

我将尺寸指定为

       <dimen name="mWidth">180dip</dimen>

我在layout.xml中使用了这样的

                          <Button   android:layout_width="180dip"
                android:layout_height="wrap_content"
                android:text="This is large text."
                />

            <Button
                android:layout_height="wrap_content"
                android:text="This is regular text one"
                />

            <Button
                style="@style/button222"
                android:layout_height="wrap_content"
                android:text="This is regular text."
                />

它给出了例外说明布局宽度,我在button222样式中提到并试图通过我的主题使用。

3 个答案:

答案 0 :(得分:10)

您应该在xml:

样式中插入尺寸值
<dimen name="buttonHeight">40px</dimen>

然后你应该引用维度值。所以在你的布局文件中你会写:

android:layout_height="@dimen/buttonHeight"

答案 1 :(得分:0)

不确定您的目标是什么:避免在layout.xml文件中提及layout_widthlayout_height是否很重要,或者您只是想找到使用这些值的任何方法从主题而不是指个人风格?

在后一种情况下,解决方案将是

layout_width="?attr/myCustomWidth"

您在CustomTheme中定义了一个属性myCustomWidth

答案 2 :(得分:0)

只需通过应用主题引用该样式,此错误就会消失。这样做:

public class CsvFormat : IPlugin
{
    public void Register(IAppHost appHost)
    {
        //Register the 'text/csv' content-type and serializers (format is inferred from the last part of the content-type)
        appHost.ContentTypes.Register(MimeTypes.Csv,
            SerializeToStream, CsvSerializer.DeserializeFromStream);

        //Add a response filter to add a 'Content-Disposition' header so browsers treat it natively as a .csv file
        appHost.GlobalResponseFilters.Add((req, res, dto) =>
        {
            if (req.ResponseContentType == MimeTypes.Csv)
            {
                res.AddHeader(HttpHeaders.ContentDisposition, $"attachment;filename={req.OperationName}.csv");
            }
        });
    }

    public void SerializeToStream(IRequest requestContext, object request, Stream stream)
    {
        CsvSerializer.SerializeToStream(request, stream);
    }
}