0

私はAndroidのクイズアプリを書いています。XML ファイルから質問を読み込み、それらを文字列に入れ、それらの文字列をボタン テキストとして使用したいと考えています。

XML 解析に問題があります。と を使用XmlPullParserFactoryXmlPullParserます。私も試してみXMLResourceParserましたが、成功しませんでした。どうすればこれを正しく達成できますか?

これは OnCreate での初期化です。

XmlPullParserFactory pullParserFactory;
    try {
        pullParserFactory = XmlPullParserFactory.newInstance();
        XmlPullParser parser = pullParserFactory.newPullParser();
        InputStream in_s = getApplicationContext().getAssets().open("new_anwers.xml");
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(in_s, null);
        loadAnswers(parser);
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

関数とヘルパー クラスは次のとおりです。

void loadAnswers(XmlPullParser parser) throws XmlPullParserException,IOException
{
    ArrayList<Answer> answers = null;
    int eventType = parser.getEventType();
    Answer currAnswer = null;

    while (eventType != XmlPullParser.END_DOCUMENT) {
        String name = null;

        switch(eventType){
        case XmlPullParser.START_DOCUMENT:
            answers = new ArrayList();
            break;
        case XmlPullParser.START_TAG:
            name = parser.getName();
            if(name == "answer1") {
                currAnswer = new Answer();                  
            } else if (currAnswer != null) {
                if(name == "text1") {
                    currAnswer.text1 = parser.nextText();
                } else if(name == "text2") {
                    currAnswer.text2 = parser.nextText();
                } else if(name == "text3") {
                    currAnswer.text3 = parser.nextText();
                } else if(name == "text4") {
                    currAnswer.text4 = parser.nextText();
                }
            }
            break;
        case XmlPullParser.END_TAG:
            name = parser.getName();
            if (name.equalsIgnoreCase("answer1") && currAnswer!= null){
                answers.add(currAnswer);
            }
        }
        eventType = parser.next();
    }
    setBtnTxt(answers);
}

class Answer {
    String text1;
    String text2;
    String text3;
    String text4;
}

void setBtnTxt(ArrayList<Answer> answers) {     
    String[] txt = new String[4];
    Iterator<Answer> it = answers.iterator();
    while(it.hasNext())
    {
        Answer currAnswer = it.next();
        txt[1] = currAnswer.text1;
        txt[2] = currAnswer.text2;
        txt[3] = currAnswer.text3;
        txt[4] = currAnswer.text4;
    }

    Button odgA = (Button) findViewById(R.id.button_OdgA);
    Button odgB = (Button) findViewById(R.id.button_OdgB);
    Button odgC = (Button) findViewById(R.id.button_OdgC);
    Button odgD = (Button) findViewById(R.id.button_OdgD);      

    odgA.setText(txt[1]);
    odgB.setText(txt[2]);
    odgC.setText(txt[3]);
    odgD.setText(txt[4]);
}

回答の XML は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<new_answers>
<answer1>
    <text1>Zvonimir</text1>
    <text2>Tomislav</text2>
    <text3>Branimir</text3>
    <text4>Viseslav</text4>
</answer1>
<answer2>
    <text1>Stipe Mesic</text1>
    <text2>Ivo Josipovic</text2>
    <text3>Franjo Tuđman</text3>
    <text4>Mate Granic</text4>
</answer2>
<answer3>
    <text1>Hrvatski politicar</text1>
    <text2>Hrvatski akademik</text2>
    <text3>Hrvatski glazbenik</text3>
    <text4>Hrvatski branitelj</text4>
</answer3>
</new_answers>
4

1 に答える 1

1

どうすればこれを正しく達成できますか?

これは XML 解析の質問とは直接関係ありませんが、回答 xml を文字列配列形式に変換して .xml 内に配置できれば、XML を解析する手間を省くことができますres/values/arrays.xml。コードでは、次を使用してアクセスできますR.array.<answer_name_id>

例えば、

<answer1>
    <text1>Zvonimir</text1>
    <text2>Tomislav</text2>
    <text3>Branimir</text3>
    <text4>Viseslav</text4>
</answer1>

になります

<string-array name="answer_1">
        <item>Zvonimir</item>
        <item>Tomislav</item>
        <item>Branimir</item>
        <item>Viseslav</item>
</string-array>

コードでは、配列に次のように簡単にアクセスできます。

String[] options = getResources().getStringArray(R.array.answer_1);

多くの配列があるため、int 配列を定義して、すべての配列への参照を保持できます。

public static final int[] ALL_ANSWERS = {
        R.array.answer_1,
        R.array.answer_2,
        R.array.answer_3,
        R.array.answer_4,
        R.array.answer_5}

また、コードでは、必要な回答をループまたはアクセスするだけで済みます。

String[] options = getResources().getStringArray(ALL_ANSWERS[index]);

ただし、他の場所から XML をダウンロードしている場合、これは機能しません。これは、すべての回答がアプリにパッケージ化されている場合にのみ機能します。

于 2013-08-08T15:41:13.883 に答える