0

Предполагая, что у меня есть пользовательский атрибут my_custom_enum для моих просмотров:Как получить все возможные значения атрибута enum?

<attr name="my_custom_enum" format="enum"> 
    <enum name="first_value" value="751"/> 
    <enum name="second_value" value="2222"/> 
    <enum name="third_value" value="1241"/> 
    <enum name="fourth_value" value="4"/> 
</attr> 

<declare-styleable name="CustomViewOne"> 
    <attr name="my_custom_enum"/> 
</declare-styleable> 

<declare-styleable name="CustomViewTwo"> 
    <attr name="my_custom_enum"/> 
</declare-styleable> 

есть способ получить все возможные значения этого перечисления в коде?

Другими словами:

Я хотел бы иметь возможность получить значения 751, 2222, 1241 и 4. names этих значений было бы хорошо, но они не являются обязательными.

+0

что вам нужно это? Кстати, посмотрите, как std перечисления обрабатываются в рамках (шрифт, видимость, scaleType и т. д.) – pskink

+0

@pskink Мне это нужно для модульного теста. Значение этого вида перечисления передается в другой модуль, который устанавливает представление. Я хотел написать тест для этого другого модуля, чтобы я мог быть уверен, что все возможные значения позаботятся. –

+0

, так что у вас есть соответствующий 'enum' в java rigth? затем вызовите 'values ​​()' static method на нем, чтобы получить все значения. – pskink

ответ

1

Решение, в котором я закончил, - это предложение, предложенное pskink в comment: разбор attrs.xml и извлечение значений самостоятельно.

Есть две причины, которые сделали это вполне разумно, чтобы сделать это таким образом:

  1. Мне нужно это для испытания единицы (чтобы узнать немного больше о том, что читал мой разговор с pskink в комментарии под вопрос).
  2. Наименование/значение пар нигде не хранится. При использовании AttributeSet используются только ints.

кода я закончил с таким:

public final class AttrsUtils { 

    private static final String TAG_ATTR = "attr"; 
    private static final String TAG_ENUM = "enum"; 
    private static final String ATTRIBUTE_NAME = "name"; 
    private static final String ATTRIBUTE_FORMAT = "format"; 
    private static final String ATTRIBUTE_VALUE = "value"; 

    @CheckResult 
    @NonNull 
    public static Map<String, Integer> getEnumAttributeValues(String attrName) 
      throws ParserConfigurationException, IOException, SAXException { 
     final File attrsFile = new File("../app/src/main/res/values/attrs.xml"); 
     DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
     Document doc = dBuilder.parse(attrsFile); 
     doc.getDocumentElement().normalize(); 

     Map<String, Integer> fontAttributes = new ArrayMap<>(); 

     NodeList nList = doc.getElementsByTagName(TAG_ATTR); 
     for (int temp = 0; temp < nList.getLength(); temp++) { 
      Node attrNode = nList.item(temp); 
      if (attrNode.getNodeType() == Node.ELEMENT_NODE) { 
       Element attrElement = (Element) attrNode; 
       final String name = attrElement.getAttribute(ATTRIBUTE_NAME); 
       if (!attrElement.hasAttribute(ATTRIBUTE_FORMAT) || !name.equals(attrName)) { 
        continue; 
       } 

       final NodeList enumNodeList = attrElement.getElementsByTagName(TAG_ENUM); 
       for (int i = 0, size = enumNodeList.getLength(); i < size; ++i) { 
        final Node enumNode = enumNodeList.item(i); 
        if (enumNode.getNodeType() == Node.ELEMENT_NODE) { 
         Element enumElement = (Element) enumNode; 
         fontAttributes.put(
           enumElement.getAttribute(ATTRIBUTE_NAME), 
           Integer.parseInt(enumElement.getAttribute(ATTRIBUTE_VALUE))); 
        } 
       } 
       break; // we already found the right attr, we can break the loop 
      } 
     } 
     return fontAttributes; 
    } 

    // Suppress default constructor for noninstantiability 
    private AttrsUtils() { 
     throw new AssertionError(); 
    } 
} 

Этот метод возвращает Map из name - value пары, которые представляют атрибут, который имеет attrName.


Для примера я написал в вопросе, вы будете использовать этот метод, как это:

Map<String, Integer> enumAttr = AttrsUtils.getEnumAttributeValues("my_custom_enum"); 
Смежные вопросы