2012-03-02 37 views
3

我有以下情況:正確的格式爲android:gravity在attrs.xml中?

styles.xml

<style name="fooStyle"> 
    <item name="android:padding">?fooView.padding</item> 
    <item name="android:background">?fooView.background</item> 
    <item name="android:gravity">?fooView.gravity</item> 
</style> 

attrs.xml

<attr name="fooView.padding" format="dimension" /> 
<attr name="fooView.background" format="color|reference" /> 
<attr name="fooView.gravity" format="????"/> 

themes.xml

<style name="fooViewTheme" parent="android:Theme"> 
    <item name="fooView.padding" >2dip</item> 
    <item name="fooView.background" >#AA000000</item> 
    <item name="fooView.gravity">right|bottom</item> 
</style> 

的問題是,我無法弄清楚什麼 fooView.gravity的格式應該是。我已經試過stringenumflag但沒有似乎工作:我總是儘快得到java.lang.NumberFormatException: unable to parse 'right|bottom' as integer爲使用這個主題被加載視圖。

所有的答案讚賞。

+0

源不給它任何'format'屬性並查看結果 – waqaslam 2012-03-02 10:00:15

+0

沒有'format'它也試圖轉換爲整數。 – Mopper 2012-03-02 10:15:41

+0

由於它不是一個真正的解決方案,可能會對tobi.b的回答不太有用。無論哪一個對其他人最有用,都可以上升到最高。 – Suragch 2017-02-09 10:33:55

回答

2

似乎是整數? Doc

將使意義,因爲它可以「邏輯或」

編輯:對不起,可能是誤解了問題......它在它的INT錯誤明確的說法,但底部不能被轉換成int:/

EDIT2:Here是int類型,如果你需要的工作,各地。抱歉沒有真正的解決方案。

+0

我打算接受這個答案,因爲似乎沒有這樣做的好方法。可能的解決方法是按照您的建議對int值進行硬編碼,或者簡單地將android:gravity放在主題外面,並在需要它的每個組件上手動設置。我使用後者的選項,因爲我不想弄清android:gravity的int值是否在某些android版本之間發生了變化。 – Mopper 2012-03-02 10:20:57

3

這是一個標記屬性。你需要在你的屬性來定義它這樣的XML:

<attr name="gravity"> 
     <flag name="right" value="0x01" /> 
     <flag name="bottom" value="0x02" /> 
     <flag name="left" value="0x04" /> 
     <!-- etc. --> 
    </attr> 

...然後使用位掩碼訪問值,像這樣:

boolean right = (array.getInt(R.styleable.fooView_gravity, 0) & 0x01) == 0x01; 
    boolean bottom = (array.getInt(R.styleable.fooView_gravity, 0) & 0x02) == 0x02; 
    boolean left = (array.getInt(R.styleable.fooView_gravity, 0) & 0x04) == 0x04; 
    // etc. 

...當然,這些值也可以使用XML:

<style name="fooViewTheme" parent="android:Theme"> 
    <item name="fooView.gravity">right|bottom</item> 
</style> 
+0

好吧,我得在某個時候嘗試一下。我真的不記得在哪個項目中,我有這個問題,它已經有一段時間了:) – Mopper 2012-08-07 13:12:14

+0

談論XML,而不是Java ... – 2016-09-11 16:09:22

+0

@YoushaAleayoub原始問題已經包含了如何在XML中使用這些值的例子,所以我沒有'我覺得有必要在我的回答中重複一遍。我的答案顯示了爲了實現這一點,必須在XML中聲明自定義屬性。不過,我已將XML使用示例編輯到我的答案中。 – 2016-09-12 16:59:52

0

由於您只需要一小部分屬性,我建議使用類型「枚舉」。

http://developer.android.com/training/custom-views/create-view.html

<attr name="labelPosition" format="enum"> 
    <enum name="left" value="0"/> 
    <enum name="right" value="1"/> 
</attr> 

引用:

custom:labelPosition="left" 

在編碼:

mTextPos = a.getInteger(R.styleable.PieChart_labelPosition, 0); 
8

這些都是由Android使用的重力的值。您可以使用您的attrs.xml

<resources> 
    <declare-styleable name="MyCustomView"> 
     <attr name="gravity"> 
      <flag name="bottom" value="80" /> 
      <flag name="center" value="17" /> 
      <flag name="center_horizontal" value="1" /> 
      <flag name="center_vertical" value="16" /> 
      <flag name="clip_horizontal" value="8" /> 
      <flag name="clip_vertical" value="128" /> 
      <flag name="end" value="8388613" /> 
      <flag name="fill" value="119" /> 
      <flag name="fill_horizontal" value="7" /> 
      <flag name="fill_vertical" value="112" /> 
      <flag name="left" value="3" /> 
      <flag name="right" value="5" /> 
      <flag name="start" value="8388611" /> 
      <flag name="top" value="48" /> 
     </attr> 
    </declare-styleable> 
</resources> 

在你的佈局XML,你可以使用這種方式:

<MyCustomView 
     custom:gravity="center|bottom" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

而且在Java代碼中,你可以使用這個讀值:

int gravity = a.getInt(R.styleable.MyCustomView_gravity, Gravity.NO_GRAVITY); 

並直接將其設置爲子視圖,如果這對您有意義:

someSubView.setGravity(gravity); 

你可以看一下那些重力值的android.view.Gravityhere