0

我正在尝试编写一个从本地 xml 文件读取的应用程序,需要一些帮助。我在这里以及 google 和 youtube 上阅读了几篇文章来读/写 xml 文件,但其中大部分是用于在线文件的。我正在寻找在 Android 本地读/写 xml。到目前为止,我认为,我需要的步骤如下。

  1. 读取 XML 文件。
  2. 将元素转换为字符串数组。
  3. 用字符串数组填充列表。

我似乎无法让前两个工作。我不是在寻找代码,也不是在寻找一种简单的方法。我真的很想弄清楚这一点,但需要你们所有大师的指导。我真的找不到读取 xml 文件的方法。根据我在这里找到的内容,我需要将 xml 文件放在 res/raw 文件夹中,然后从那里开始,我不太确定该怎么做。如何将其读入数组?一旦我启动并运行了这个东西,我会尽我所能发布代码,并希望能帮助遇到类似问题的其他人。再次感谢!

4

2 回答 2

2

在你的主要课程中

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class SimpleList extends Activity {  //SimpleList is the name of this class

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final ListView lv=(ListView)findViewById(R.id.listView1);       

        //final ArrayList<String> myNewList = new ArrayList<String>();

        ArrayAdapter<CharSequence> adapter=ArrayAdapter.createFromResource(this, R.array.simple_array,android.R.layout.simple_list_item_1);
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                // TODO Auto-generated method stub      
                String item=lv.getItemAtPosition(arg2).toString();
                String itemordered;
                itemordered = item + " added to list";
                Toast.makeText(getApplicationContext(), itemordered, Toast.LENGTH_LONG).show();
            }
        });
    }
}

在 strings.xml 中创建一个字符串数组

<resources>

    <string name="app_name">SimpleList</string>
    <string name="menu_settings">Settings</string>
    <string name="title_activity_main">SimpleList</string>

    <string-array name="simple_array">
        <item>Bacon Double Cheese Burger</item>
        <item>Bacon Cheeses Burger</item>
        <item>Cheese Burger</item>
        <item>Hamburger</item>
        <item>Grilled Chicken Sandwich</item>
        <item>Crispy Chicken Sandwich</item>
        <item>Chicken Strips</item>
        <item>Hot Dog</item>
        <item>Chocolate Chip Cookie Dough Polar Swirl</item>
        <item>Vanilla Shake</item>
        <item>Chocolate Shake</item>
        <item>Strawberry Shake</item>
    </string-array>


</resources>    

在 main.xml 中为您的 ListView 创建一个布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:divider="#FFCC00"
        android:dividerHeight="2dp" >
    </ListView>

</LinearLayout> 
于 2012-07-21T01:01:04.887 回答
1

我终于让它按照我想要的方式工作,这就是我想要完成的。对于所有提供答案的人,非常感谢!我取了你的每一个图案,并根据我的需要对其进行定制。我绝不是 android/java/xml 专家,但这就是我得到的,它的工作方式是我想要的!

public class MainActivity extends Activity {

Spinner spinner;
List<String> ingredient = new ArrayList<String>();
List<String> effect1 = new ArrayList<String>();
List<String> effect2 = new ArrayList<String>();
List<String> effect3 = new ArrayList<String>();
List<String> effect4 = new ArrayList<String>();

XmlResourceParser myXml;
int eventType;
String nodeValue;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    loadXml(); // Reads XML and loads it into Lists, One list for each element
    convertListToSpinner(); // Takes Lists and merges data with Spinners (Currently Unimplemented)


}


private void convertListToSpinner() {
    // TODO Auto-generated method stub

}


private void loadXml() {
    // TODO Auto-generated method stub
    myXml = getBaseContext().getResources().getXml(R.xml.xmlfilename);
    try {
        myXml.next();

    eventType = myXml.getEventType(); // Get current xml Event

    } catch (XmlPullParserException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    while(eventType != XmlPullParser.END_DOCUMENT){
        if(eventType == XmlPullParser.START_DOCUMENT){
            // checks can be placed here to make sure file is read
        }
        else if(eventType == XmlPullParser.START_TAG){
            nodeValue = myXml.getName();

            try{
            if(nodeValue.equalsIgnoreCase("Ingredient")){ //Finds Ingredient tag
            myXml.next(); //Since the ingredient tag does not hold the text, we go to next element area
            ingredient.add(myXml.getText().trim()); // Set the text of the Ingredient tag to list
            }

            //Since the effect tags are followed by ending tags, we can just do nextText() to get tag text
            if(nodeValue.equalsIgnoreCase("Effect1")){
                effect1.add(myXml.nextText().trim()); // Set the text of the Effect1 tag to list
            }
            if(nodeValue.equalsIgnoreCase("Effect2")){
                effect2.add(myXml.nextText().trim()); // ditto
            }
            if(nodeValue.equalsIgnoreCase("Effect3")){
                effect3.add(myXml.nextText().trim()); // ditto
            }
            if(nodeValue.equalsIgnoreCase("Effect4")){
                effect4.add(myXml.nextText().trim()); // ditto
            }
            }catch(Exception e){
                e.getMessage();
            }


        }
        try {
            eventType = myXml.next();
        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    for(int i = 0; ingredient.size() > i; i++){
        System.out.println(ingredient.get(i));

    }

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}




}

XML 文件是当前格式。

<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        name="item"
        type="string">
        <Ingredient>
         Intrests
            <effect1>
            Android
            </effect1>
            <effect2>
            Programming
            </effect2>
            <effect3>
            Type O Negative
            </effect3>
            <effect4>
            Sirenia
            </effect4>
        </Ingredient>
        <Ingredient>
        Virtues
            <effect1>
        Power
            </effect1>
            <effect2>
        Money
            </effect2>
            <effect3>
        Knowledge
            </effect3>
            <effect4>
        Kindness
            </effect4>
        </Ingredient>
    </item>
</resources>

我希望这可以帮助其他遇到类似问题的人。再次感谢 Sobo 和 HADEV 的贡献!

我确信有更好的方法来做正在做的事情,但我很高兴我能做到这一点:)

于 2012-07-21T18:20:48.077 回答