0

用于测试目的:

在这里,例如:

<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"/>

重力 int 等效值为:8388627。

如何重新解析 8388627 以获得字符串 "center_vertical|start" ?

4

1 回答 1

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(guava) 或 Apache Commons。

于 2016-08-11T15:09:37.513 回答