ボタン用に定義されたスタイルで属性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>
これは、インセットタグをシェイプにラップすることで実現できるようです。
このような:
<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>
素晴らしい答えがあります ここではstackoverflow 。基本的に、LayoutParams
(layout_)は、子ビューに使用され、親ViewGroup
にどのように配置するかを指示します。ただし、LayoutParams
は各ViewGroup
タイプ(LinearLayout
、RelativeLayout
、FrameLayout
など)に固有であるため、LayoutParams
はテーマについてこのように一般化することはできません。
テーマで完全に一般化されたスタイルを使用することはできないため、これはすべて非常に残念ですが、次のように、必要な特定のビューごとにスタイルを使用できます。
<Button style="@style/btnstyle"/>
これの底に到達したことがありますか?私は同じ問題を抱えています。テーマ内のスタイルを介してButtonまたはImageButtonに適用される場合、すべてのマージン属性は無視されます。
ただし、ボタンの「style」属性を使用してスタイルを直接適用すると、doesが機能することがわかりました。マージンは「buttonStyle」仕様の一部ではないようです。
これはAndroidのバグだと思います。
一方、スタイルを使い始めたときは、すべてをスタイル内に配置しました。すべてのウィジェットのスタイルを作成していることに気づきました。現在、スタイル内に位置属性を配置しています。
したがって、XML要素のwidth
、height
、padding
、およびlayout
プロパティと、スタイル内の残りの属性。
短い答え:カスタムスタイルで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
を拡張するネストされたクラスを実装します。したがって、LayoutParams
はViewGroup
のタイプに固有です。これが意味するのは、TableLayout
とLinearLayout
の両方がLayoutParams
の1つとしてlayout_margin
を持っている場合でも、それらは完全に異なる属性と見なされるということです。
したがって、layout_margin
は、どこにでも適用できる単なる一般的な属性ではありません。有効な引数として具体的に定義するViewGroup
のコンテキスト内で適用する必要があります。 ViewGroup
が適用される場合、ビューはその親LayoutParams
のタイプを認識している必要があります。
テーマにそのスタイルを含め、スタイルにlayout_marginを指定し、そのテーマをアプリケーション/アクティビティに適用しようとすると、ViewGroupの親がまだ指定されておらず、引数が無効であるため、レイアウト属性が削除されます。ただし、親EditText
(TableLayout
)がわかっているため、ViewGroup
で定義されたTableLayout
ビューにスタイルを適用することはできます。
出典:
レイアウトパラメータ に関するAndroidのドキュメント。
この質問 by AndroidフレームワークエンジニアおよびStackOverflowユーザー adamp 。
また、StackOverflowユーザーによって この質問 に与えられた回答 inazaruk 。
私はこの答えのクレジットを望んでいません本当のヒーローはここにあります- https: //stackoverflow.com/a/13365288/4741746