Android Java — использование DocumentBuilder для анализа () файла res/layout xml

TL; DR: почему нет

    File rewardFile = new File("res/layout/reward_cards.xml");

Работа в Android Studio?

У меня возникли проблемы со ссылкой на файл res/layout в Android Studio, чтобы получить экземпляр документа DocumentBuilder для его анализа.

То, что я пытаюсь сделать, это создать переменное количество объектов CardView в нижней части объекта RelativeLayout.

Моя текущая настройка включает раздувание объекта CardView из отдельного файла макета и добавление его в существующее представление RelativeLayout. Затем измените XML-файл CardView, чтобы он представлял следующий добавляемый CardView, и выполните повторное раздувание из файла макета.

private void generateRewards(Context context, RelativeLayout mainRL) {
    LayoutInflater inflater = LayoutInflater.from(context);

    View rewardLayout = inflater.inflate(R.layout.reward_cards, null, false);

    RelativeLayout.LayoutParams rParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    rParams.addRule(RelativeLayout.BELOW, mainRL.findViewById(R.id.cardFutureGoals).getId()); //This is the current bottom view

    mainRL.addView(rewardLayout, rParams);

    //Now to edit the XML

    DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();

    DocumentBuilder docBuilder = null;
    try {
        docBuilder = docFactory.newDocumentBuilder();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    }

    File rewardFile = new File("res/layout/reward_cards.xml");

    Document rewardDoc = null;
    if(rewardFile.exists()) {  //This Fails
        try {
            rewardDoc = docBuilder.parse(rewardFile);
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //Just changing the CardView's id for now

    Node rootCard = null;
    rootCard = rewardDoc.getFirstChild();
    NamedNodeMap attr = rootCard.getAttributes();
    Node rewardId = attr.getNamedItem("id");
    rewardId.setTextContent("@+id/reward2");

    Transformer t = null;
    try {
        t = TransformerFactory.newInstance().newTransformer();
    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    }

    DOMSource domSource = new DOMSource(rewardDoc);
    StreamResult s = new StreamResult("res/layout/reward_cards.xml"); //This will probably also fail
    try {
        t.transform(domSource, s);
    } catch (TransformerException e) {
        e.printStackTrace();
    }

    ...

    //Inflate again and add the next cardview

    rewardLayout = inflater.inflate(R.layout.reward_cards, null, false);

    rParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    rParams.addRule(RelativeLayout.BELOW, mainRL.findViewById(R.id.reward1).getId());

    mainRL.addView(rewardLayout, rParams);
}

А вот моя награда.XML:

<?xml version="1.0" encoding="utf-8"?>

<android.support.v7.widget.CardView
    
    
    android_id="@+id/reward1"
    android_layout_width="match_parent"
    android_layout_height="wrap_content"
    android_layout_weight="0.30"
    android_background="#00CF98"
    android_layout_marginLeft="4dp"
    android_layout_marginRight="4dp"
    android_layout_marginBottom="5dp"
    android_layout_marginTop="5dp">

    <RelativeLayout
        android_layout_width="match_parent"
        android_layout_height="100dp"
        android_layout_alignParentLeft="true"
        android_background="#ffffff">

        ...

    </RelativeLayout>


</android.support.v7.widget.CardView>

Поэтому добавление следующего CardView в конечном итоге будет помещено в петлю, но я просто пытаюсь получить

File rewardFile = new File("res/layout/reward_cards.xml");

Работать на этом этапе.

Как сослаться на файл reward_cards layout здесь?

Есть ли более простой способ выполнить то, что я пытаюсь сделать?

Будет ли этот метод работать?

Спасибо

1 ответ

  1. TL; DR: почему не File rewardFile = new File("res/layout/reward_cards.xml");работает в Android Studio?

    Поскольку ресурс-это файл только на машине разработки. Это не файл на устройстве.

    Затем измените XML-файл CardView, чтобы он представлял следующий добавляемый CardView, и выполните повторное раздувание из файла макета.

    Нельзя изменять ресурсы во время выполнения.

    Будет ли этот метод работать?

    Нет.

    Есть ли более простой способ выполнить то, что я пытаюсь сделать?

    Шаг #1: надуть макет.

    Шаг #2: вызовите методы на CardViewи его содержимое, чтобы изменить его, как вы считаете нужным.

    Шаг #3: Добавьте измененный CardViewRelativeLayout.

    Шаг №4: вспенить, промыть, повторить.

    Если у вас будет много таких CardViewконтейнеров, рассмотрите возможность использования a RecyclerViewили ListViewвместо a RelativeLayout.