我有以下情况:
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
的格式应该是什么。我已经尝试使用string
,enum
和flag
,但似乎没有效果:只要加载使用此主题的视图,我就会得到java.lang.NumberFormatException: unable to parse 'right|bottom' as integer
。
感谢所有答案。
答案 0 :(得分:16)
这些是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.Gravity
或here
答案 1 :(得分: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>
答案 2 :(得分:2)
似乎是整数? Doc
有意义,因为它可以'ored'
编辑:对不起,可能误读了问题...在错误中明确说明它是int,但是底部不能转换为int:/
Edit2:Here是int值,如果你需要解决。很抱歉没有真正的解决方案。
答案 3 :(得分:1)
由于您只需要少量属性,我建议使用类型&#34; enum&#34;。
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);