【问题标题】:To use layout_marginLeft in a button style applied as a theme?在作为主题应用的按钮样式中使用 layout_marginLeft?
【发布时间】:2011-04-16 02:11:42
【问题描述】:

我在为按钮定义的样式中使用了属性layout_marginLeft="30dip"。当我为每个按钮单独应用此样式时,左边距会按我的意愿放置。

然后我定义了一个主题,我将按钮样式分配给属性android:buttonStyle 并将其应用于我的项目。
但是,左边距属性被忽略。知道我必须在这里做什么吗?

style.xml如下:

<style name="btnstyle" parent="@android:style/Widget.Button">
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_marginLeft">30dip</item>
    <item name="android:textColor">#FFFFFF</item>       
</style> 

<style name="appstyle" parent="android:Theme"> 
    <item name="android:buttonStyle">@style/btnstyle</item> 
</style>

【问题讨论】:

    标签: android button coding-style themes margins


    【解决方案1】:

    看起来这可以通过在形状周围包裹一个 insets 标签来实现。

    像这样:

    <inset xmlns:android="http://schemas.android.com/apk/res/android"
        android:insetLeft="5dp"
        android:insetRight="5dp"
        android:insetTop="5dp"
        android:insetBottom="5dp">
    
    <shape  
        android:shape="rectangle">
        <solid 
            android:color="#fff"/>
        <stroke
            android:width="1dp"
            android:color="#333"/>
        <corners 
            android:radius="10dp"/>
    </shape>
    </inset>
    

    【讨论】:

    • 经过多次尝试,这是唯一对我有用的方法,谢谢。
    【解决方案2】:

    有一个很棒的答案here on stackoverflow。基本上LayoutParams (layout_) 用于子视图告诉他们的父ViewGroup 他们应该如何定位。但是LayoutParams 特定于每个ViewGroup 类型(LinearLayoutRelativeLayoutFrameLayout 等),所以LayoutParams 不能以这种方式概括为一个主题。

    所有这一切都非常不幸,因为您不能在主题中使用完全通用的样式,但您仍然可以在需要的每个特定视图中使用该样式,如下所示:

    <Button style="@style/btnstyle"/>
    

    【讨论】:

    • 那么按钮默认有边距怎么办?框架是如何做到的?
    • @Nilzor 按钮没有边距,它们具有内置边距/填充的图形。检查资源文件夹,你会看到。如果您将背景图形设置为其他内容,则按钮将没有任何边距
    • 谢谢。所以我想这是任何设计自己的按钮的人都可以采用的方法。
    • @Nilzor 是的,但实际上它更像是填充而不是边距:)
    【解决方案3】:

    有没有弄明白这件事的真相?我有同样的问题;当通过主题中的样式应用于 Button 或 ImageButton 时,所有边距属性都会被忽略。

    但是,我发现它确实在使用按钮上的“样式”属性直接应用样式时起作用。似乎边距不是“buttonStyle”规范的一部分。

    【讨论】:

    • 好吧,我设法解决了。我没有设置边距,而是指定了属性下方的按钮。例如,指定按钮 2、3 和 4 在按钮 1 下方对齐。我没有找到任何其他出路。
    【解决方案4】:

    我猜这是 Android 中的一个错误。

    另一方面,当我开始使用样式时,我将所有内容都放在样式中。我注意到我正在为每个小部件创建一个样式。现在,我将位置属性放在样式中。

    因此,XML 元素中的widthheightpaddinglayout 属性以及样式中的其余属性。

    【讨论】:

    • 这是 android 框架中的一个错误。如果通过主题引用 layout_margin* 属性,则样式中将忽略它们。
    • 这真令人气愤。 layout_marginRight 和 marginLeft 不会被忽略。但是 top 和 bottom 被忽略了。
    【解决方案5】:

    简短回答:如果您在自定义样式中指定 layout_margin,则必须将此样式显式应用于您希望具有指定边距的每个单独视图(如下面的代码示例所示) .在主题中包含此样式并将其应用于您的应用程序或活动将不起作用。

    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#FFFFFF" >
        <TableRow>
            <EditText android:hint="@string/last_name" style="@style/edit_text_default" />
        </TableRow>
        <TableRow>
            <EditText android:hint="@string/first_name" style="@style/edit_text_default" />
        </TableRow>
    </TableLayout>
    

    解释:layout_ 开头的属性是LayoutParams,或其子类之一(例如MarginLayoutParams)。 LayoutParams 被视图用来告诉他们的父 ViewGroup 他们想要如何布局。每个ViewGroup 类都实现了一个扩展ViewGroup.LayoutParams 的嵌套类。因此,LayoutParams 特定于ViewGroup 的类型。这意味着虽然TableLayoutLinearLayout 可能都将layout_margin 作为LayoutParams 之一,但它们被认为是完全不同的属性。

    所以layout_margin 不仅仅是可以在任何地方应用的通用属性。它必须在ViewGroup 的上下文中应用,专门将其定义为有效参数。当应用LayoutParams 时,视图必须知道其父ViewGroup 的类型。

    在样式中指定 layout_margin,包括主题中的样式,并尝试将该主题应用于应用程序/活动将导致布局属性被删除,因为尚未指定 ViewGroup 父级,因此参数无效.但是,将样式应用于使用 TableLayout 定义的 EditText 视图是可行的,因为父级 ViewGroupTableLayout)是已知的。

    来源:

    Layout Parameters 上的 Android 文档。

    Android 框架工程师和 StackOverflow 用户 adampthis question 的答案。

    另外,StackOverflow 用户 inazarukthis question 的答案。

    我不想要这个答案的任何功劳真正的英雄就在这里 - https://stackoverflow.com/a/13365288/4741746

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-02
      • 2013-12-23
      • 2017-04-20
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2014-11-27
      • 1970-01-01
      相关资源
      最近更新 更多