Перепроизвести гравитацию Android

Для целей тестирования:

Вот, например:

<TextView    
     android:id="@id/expander"
     android:text="Fewer Details"
     android:layout_gravity="center_vertical|start"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"/>

Эквивалентная сила тяжести равна:8388627.

Как повторить анализ 8388627 для получения строки "center_vertical|start"?

1 ответ

Глядя на Gravity объект, вам нужно перевести дескрипторы XML в константы объекта:

  • center_vertical -> Gravity.CENTER_VERTICAL Постоянное значение: 16 (0x00000010)
  • start -> Gravity.START Постоянное значение: 8388611 (0x00800003)

Вы добавляете их, и вы получаете свою ценность (8388627).

Обратное можно сделать с помощью логических операций в 3 этапа:

  • устранить общие флаги (например, Gravity.RELATIVE_LAYOUT_DIRECTION)
  • постепенно устранять другие флаги
  • рекомбинировать общие и нормальные флаги обратно (например, LEFT + RELATIVE_LAYOUT_DIRECTION = START) - это необязательно

Мой подход будет следующим:

Create a Map<int, String> modifiers
Create a Map<int, String> flags
Create a List<int> components

Populate modifiers with all generic flags and their corresponding strings
  Use something like (flag > 0x0010000 && (flag & 0x0000FFFF == 0))
Populate flags with all other elements ( < 0x0010000)

// Note: Don't populate modifiers with elements like Gravity.START

int value = my_value_to_parse

for (int i in modifiers.keys()) {
    if (value & i > 0) {
        components.add(i)
        value = value & !i
    }
}
// Same code for the flags
for (int i in flags.keys())
    ...

// One can add logic for merging composite flags here

// And add the components to a string
String result = ""
for (int component: components) {
   if (modifiers.containsKey(component))
       result += modifiers.get(component)
   else if (flags.containsKey(component))
       result += flags.get(component)

   result += "|"

// Return everything except last | character
return result.substring(0, result.length() - 2)

Вы можете использовать этот вопрос для создания Map строк и кодов.

Чтобы преобразовать список в строку, вы также можете создать список и использовать Join (гуава) или Apache Commons.

Другие вопросы по тегам