web-dev-qa-db-ja.com

テーマとして適用されるボタンスタイルでlayout_marginLeftを使用するには?

ボタン用に定義されたスタイルで属性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>
28
kiki

これは、インセットタグをシェイプにラップすることで実現できるようです。

このような:

<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>
13
Fracdroid

素晴らしい答えがあります ここではstackoverflow 。基本的に、LayoutParams(layout_)は、子ビューに使用され、親ViewGroupにどのように配置するかを指示します。ただし、LayoutParamsは各ViewGroupタイプ(LinearLayoutRelativeLayoutFrameLayoutなど)に固有であるため、LayoutParamsはテーマについてこのように一般化することはできません。

テーマで完全に一般化されたスタイルを使用することはできないため、これはすべて非常に残念ですが、次のように、必要な特定のビューごとにスタイルを使用できます。

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

これの底に到達したことがありますか?私は同じ問題を抱えています。テーマ内のスタイルを介してButtonまたはImageButtonに適用される場合、すべてのマージン属性は無視されます。

ただし、ボタンの「style」属性を使用してスタイルを直接適用すると、doesが機能することがわかりました。マージンは「buttonStyle」仕様の一部ではないようです。

3
ShibbyUK

これはAndroidのバグだと思います。

一方、スタイルを使い始めたときは、すべてをスタイル内に配置しました。すべてのウィジェットのスタイルを作成していることに気づきました。現在、スタイル内に位置属性を配置しています。

したがって、XML要素のwidthheightpadding、およびlayoutプロパティと、スタイル内の残りの属性。

2
Macarse

短い答え:カスタムスタイルで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の両方がLayoutParamsの1つとしてlayout_marginを持っている場合でも、それらは完全に異なる属性と見なされるということです。

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

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

出典:

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

この質問 by AndroidフレームワークエンジニアおよびStackOverflowユーザー adamp

また、StackOverflowユーザーによって この質問 に与えられた回答 inazaruk

私はこの答えのクレジットを望んでいません本当のヒーローはここにあります- https: //stackoverflow.com/a/13365288/4741746

0
sushant gosavi