web-dev-qa-db-ja.com

Android-カスタムスタイルで指定されたマージンが有効にならない

EditTextのデフォルトのマージンを10 dpにしたいと思います。そのため、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>
27
Groppe

簡単な回答:カスタムスタイルで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 またはそのサブクラスの1つ(例 MarginLayoutParams )。 LayoutParamsはビューが親に伝えるために使用されます ViewGroup ビューのレイアウト方法。すべてのViewGroupクラスは、ViewGroup.LayoutParamsを拡張するネストされたクラスを実装します。したがって、LayoutParamsViewGroupのタイプに固有です。つまり、TableLayoutLinearLayoutはどちらもlayout_marginLayoutParamsとして持っている場合がありますが、これらは完全に異なる属性と見なされます。

したがって、layout_marginは、どこにでも適用できる単なる一般的な属性ではありません。有効な引数として明確に定義するViewGroupのコンテキスト内で適用する必要があります。ビューは、ViewGroupが適用される場合、親のタイプLayoutParamsawareにする必要があります。

テーマのスタイルを含むスタイルでlayout_marginを指定し、そのテーマをアプリケーション/アクティビティに適用しようとすると、レイアウト属性が削除されます。これは、ViewGroup親がまだ指定されていないため、引数が無効であるためです。ただし、親EditTextTableLayout)がわかっているため、ViewGroupで定義されているTableLayoutビューにスタイルを適用すると機能します。

出典:

レイアウトパラメータ に関するAndroidドキュメント。

この質問 への回答AndroidフレームワークエンジニアおよびStackOverflowユーザー adamp による。

また、StackOverflowユーザー inazarukこの質問 に回答します。

49
Groppe

マニフェストで正しいテーマ名を使用しないでください。次のように変更してみてください。

<application
     Android:icon="@drawable/ic_launcher"
     Android:label="@string/app_name"
     Android:theme="@style/MyTheme" >
1
James McCracken

他の人に役立つ場合に備えて、私は 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を示します。ここでは、マージンを2 dpに設定するために 別のOlivによる回答SO質問 が使用されます::

<?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>
0
Hong