2010-09-23 69 views
28

我在爲按鈕定義的樣式中使用了屬性layout_marginLeft="30dip"。當我爲每個按鈕單獨應用此樣式時,左邊距會根據需要放置。要在應用爲主題的按鈕樣式中使用layout_marginLeft?

但後來我定義了一個主題,我將按鈕樣式分配給屬性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> 

回答

3

自從得到這條底線?我有同樣的問題;當通過主題中的樣式應用於Button或ImageButton時,所有邊距屬性都將被忽略。

但是,我發現它確實直接使用按鈕上的「樣式」屬性直接應用樣式。看起來利潤率不是「buttonStyle」規範的一部分。

+0

好,我有一個解決辦法進行管理。我只是在屬性下面指定了按鈕,而不是設置保證金。例如,指定按鈕2,3和4在按鈕1下方對齊。我沒有找到任何其他出路。 – kiki 2011-07-01 06:50:55

2

我想這是Android中的一個錯誤。

另一方面,當我開始使用樣式時,我將所有內容放在樣式中。我注意到我正在爲每個小部件創建一個樣式。現在,我將位置屬性放置在一個樣式中。

所以,widthheightpadding和XML元素和風格里面的其餘屬性layout性能。

+1

這是android框架中的一個錯誤。 layout_margin *屬性在樣式中被忽略,如果它們通過主題引用。 – Anderson 2014-04-28 19:28:55

+0

這是真氣。 layout_marginRight和marginLeft不會被忽略。然而頂部和底部被忽略。 – 2016-01-22 15:10:00

10

有一個很棒的回答here on stackoverflow。基本上LayoutParams(layout_)用於子視圖,以告知他們的父母ViewGroup應該如何定位它們。但是LayoutParams對於每個ViewGroup類型(LinearLayout,RelativeLayout,FrameLayout等)都是特定的,所以LayoutParams不能以這種方式推廣爲主題。

這一切是非常不幸的,因爲你不能使用完全廣義風格的主題,但你仍然可以使用樣式在你需要它,就像下面的每個具體觀點:

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

默認情況下,按鈕如何具有邊距?框架如何做到這一點? – Nilzor 2016-02-14 10:03:34

+1

@Nilzor按鈕沒有邊距,它們有基於邊緣/填充的圖形。檢查資源文件夾,你會看到。如果您將背景圖形設置爲其他東西,按鈕將不會有任何保證金 – Warpzit 2016-02-14 11:41:50

+0

謝謝。所以我想這是一個方法,任何設計自己的按鈕的人都可以採用。 – Nilzor 2016-02-14 13:51:18

13

它看起來像這可以通過在形狀周圍包裹一個insets標籤來實現。

像這樣:

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

經過多次嘗試,這是唯一適合我的,謝謝。 – kometonja 2016-11-23 15:32:22

0

答案很簡單:如果您在自定義樣式指定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的類型。這意味着雖然TableLayoutLinearLayout可能都具有layout_margin作爲其中一個LayoutParams,但它們被認爲是完全不同的屬性。

因此layout_margin不只是一般屬性,可以在任何地方應用。它必須在ViewGroup的範圍內應用,將其明確定義爲有效參數。當應用LayoutParams時,視圖必須是,其識別其父類型ViewGroup

指定樣式中的layout_margin(包括該樣式在主題中),並試圖將該主題應用於應用程序/活動將導致佈局屬性被刪除,因爲尚未指定ViewGroup父項,因此參數爲無效。但是,將樣式應用於已用TableLayout定義的EditText視圖可行,因爲父類ViewGroupTableLayout)是已知的。

來源:

Layout Parameters Android文檔。

Android框架工程師和StackOverflow用戶adamp給出的this question的回答。

此外,StackOverflow用戶inazaruk給出的this question的回答。

我不希望這個答案真正的英雄的任何信用是在這裏 - https://stackoverflow.com/a/13365288/4741746