Правильный формат для Android: гравитация в attrs.xml? - PullRequest
6 голосов
/ 02 марта 2012

У меня следующая ситуация:

в 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="????"/>

in 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, как только загружается представление, использующее эту тему.

Все ответы приветствуются.

Ответы [ 4 ]

17 голосов
/ 24 сентября 2016

Это значения гравитации, используемые 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 или здесь

3 голосов
/ 03 августа 2012

Это атрибут флага. Вы должны определить это в своих атрибутах 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 голосов
/ 02 марта 2012

кажется целым числом? Doc .

Имеет смысл, так как это может быть 'ored'

Редактировать: извините, возможно, неправильно прочитал проблему ... В ошибке ясно сказано, что это int, но bottom не может быть преобразован в int: /

Edit2: Здесь - это значения int, если вам нужно обойти это.Извините за отсутствие реального решения.

1 голос
/ 07 июля 2014

Поскольку вам нужен только небольшой выбор атрибутов, я бы предложил использовать тип "enum".

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...