To use layout_marginLeft in a button style applied as a theme?

浪子不回头ぞ 提交于 2019-12-02 20:18:47

It looks like this can be achieved by wrapping an insets tag around the shape.

Like this:

<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>
Warpzit

There is an awesome answer here on stackoverflow. Basically LayoutParams (layout_) are used for child views to tell their parent ViewGroup how they should be positioned. But LayoutParams are specific to each ViewGroup type (LinearLayout, RelativeLayout, FrameLayout etc.) so LayoutParams can not be generalized in this way for a theme.

All this is very unfortunate as you can't use completely generalized styles in a theme but you can still use the style for each specific view where you need it, like following:

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

Ever get to the bottom of this? I'm having the same issue; all margin attributes are ignored when applied to a Button or ImageButton via a style within a theme.

However, I've found it does work when the style is applied directly using the "style" attribute on the button. It seems that margins are not part of the "buttonStyle" spec.

I would guess this is a bug in Android.

On the other hand, when I started using styles I placed everything inside the style. I noticed that I was creating a style for every widget. Right now, I place position attributes inside a style.

So, width, height, padding and layout properties in the XML element and the rest of the attributes inside the style.

Short Answer: If you are specifying layout_margin in a custom style, this style must be explicitly applied to each individual view that you wish to have the specified margin (as seen in the code sample below). Including this style in a theme and applying it to your application or an activity will not work.

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

Explanation: Attributes which begin with layout_ are LayoutParams, or one of its subclasses (e.g. MarginLayoutParams). LayoutParams are used by views to tell their parent ViewGroup how they want to be laid out. Each and every ViewGroup class implements a nested class that extends ViewGroup.LayoutParams. Therefore, LayoutParams are specific to the ViewGroup's type. What this means is that while a TableLayout and a LinearLayout may both have layout_margin as one of it's LayoutParams, they are considered to be completely different attributes.

So layout_margin is not just general attribute that can be applied anywhere. It must be applied within the context of a ViewGroup that specifically defines it as a valid argument. A view must be aware of the type of its parent ViewGroup when LayoutParams are applied.

Specifying layout_margin in a style, including that style in a theme, and attempting to apply that theme to an application/activity will result in the layout attributes being dropped, because no ViewGroup parent has been specified yet and so the arguments are invalid. However, applying the style to an EditText view that has been defined with a TableLayout works, because the parent ViewGroup (the TableLayout) is known.

Sources:

Android documentation on Layout Parameters.

Answer given to this question by Android framework engineer and StackOverflow user adamp.

Also, answer given to this question by StackOverflow user inazaruk.

I dont want any Credit of this answer the real hero is here - https://stackoverflow.com/a/13365288/4741746

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!