28

我希望 EditText 的默认边距为 10dp。因此,在我的 styles.xml 文件中,我设置了以下内容:

<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="MyTheme" parent="android:style/Theme.NoTitleBar">
        <item name="android:editTextStyle">@style/edit_text_default</item>
    </style>

    <style name="edit_text_default" parent="android:style/Widget.EditText">
        <item name="android:layout_margin">10dp</item>
    </style>

</resources>

然后在 AndroidManifest.xml 中,我将应用程序主题设置为我定义的主题:

<application
     android:icon="@drawable/ic_launcher"
     android:label="@string/app_name"
     android:theme="@style/MyTheme" >
...

主题的“无标题栏”方面正在发挥作用。但是,EditText 的默认边距不是,它仍在填充父级。这是我的表格视图:

<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" />
    </TableRow>
    <TableRow>
        <EditText android:hint="@string/first_name" />
    </TableRow>
</TableLayout>
4

3 回答 3

57

简短回答:如果您在自定义样式中指定 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's 的类型。这意味着虽然 aTableLayout和 aLinearLayout可能都具有layout_marginit's 之一LayoutParams,但它们被认为是完全不同的属性。

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

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

资料来源:

布局参数的Android 文档。

Android 框架工程师和 StackOverflow 用户adamp对此问题的回答。

另外,StackOverflow 用户inazaruk对此问题的回答。

于 2012-11-13T17:07:11.793 回答
1

您没有在清单中使用正确的主题名称。尝试将其更改为:

<application
     android:icon="@drawable/ic_launcher"
     android:label="@string/app_name"
     android:theme="@style/MyTheme" >
于 2012-10-31T21:19:30.993 回答
0

以防万一它对其他人有用,我想在这里将Oliv 的答案带到另一个 SO 问题。我试图为所有按钮添加边距,发现 layout_margin 不起作用。

主题:

<style name="FooThemeStyle" parent="Base.Theme.AppCompat">
    <item name="android:buttonStyle">@style/FooButton</item>
    <item name="buttonStyle">@style/FooButton</item>
</style>

按钮样式:

<style name="FooButton" parent="Widget.AppCompat.Button">
    <item name="android:background">@drawable/button_background</item>
</style>

这是 button_background.xml,其中Oliv 对另一个 SO 问题的回答用于将边距设置为 2dp: :

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="2dp"
        android:left="2dp"
        android:right="2dp"
        android:top="2dp">
        <selector xmlns:android="http://schemas.android.com/apk/res/android">
          ...
        </selector>
    </item>
</layer-list>
于 2018-02-27T17:19:55.650 回答