2016-07-07 88 views
-1

我试图加载ArrayList的文件到ArrayList中的数据,但我得到这个异常错误:负荷值到ArrayList中

07-07 16:52:21.741: W/System.err(1941): org.xml.sax.SAXParseException: Unexpected token (position:TEXT [[email protected]:28 in [email protected]) 
07-07 16:52:21.741: W/System.err(1941):  at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:146) 
07-07 16:52:21.743: W/System.err(1941):  at com.example.ActivityQuizScreen.addflags(ActivityQuizScreen.java:253) 
07-07 16:52:21.743: W/System.err(1941):  at com.example.ActivityQuizScreen.onCreate(ActivityQuizScreen.java:108) 
07-07 16:52:21.743: W/System.err(1941):  at android.app.Activity.performCreate(Activity.java:6237) 
07-07 16:52:21.743: W/System.err(1941):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
07-07 16:52:21.745: W/System.err(1941):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
07-07 16:52:21.745: W/System.err(1941):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
07-07 16:52:21.745: W/System.err(1941):  at android.app.ActivityThread.-wrap11(ActivityThread.java) 
07-07 16:52:21.745: W/System.err(1941):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
07-07 16:52:21.746: W/System.err(1941):  at android.os.Handler.dispatchMessage(Handler.java:102) 
07-07 16:52:21.746: W/System.err(1941):  at android.os.Looper.loop(Looper.java:148) 
07-07 16:52:21.746: W/System.err(1941):  at android.app.ActivityThread.main(ActivityThread.java:5417) 
07-07 16:52:21.747: W/System.err(1941):  at java.lang.reflect.Method.invoke(Native Method) 
07-07 16:52:21.747: W/System.err(1941):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
07-07 16:52:21.747: W/System.err(1941):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
07-07 16:52:21.877: W/EGL_emulation(1941): eglSurfaceAttrib not implemented 
07-07 16:52:21.877: W/OpenGLRenderer(1941): Failed to set EGL_SWAP_BEHAVIOR on surface 0xac0b28c0, error=EGL_SUCCESS 
07-07 16:52:22.429: E/Surface(1941): getSlotFromBufferLocked: unknown buffer: 0xabff43b0 
07-07 16:53:21.877: W/EGL_emulation(1941): eglSurfaceAttrib not implemented 
07-07 16:53:21.880: W/OpenGLRenderer(1941): Failed to set EGL_SWAP_BEHAVIOR on surface 0xac0b2ee0, error=EGL_SUCCESS 

代码:

@SuppressWarnings("unchecked") 
private void addflags() throws ParserConfigurationException, SAXException, IOException{ 

    ArrayList<Flag> flagList = new ArrayList<Flag>(); 

    DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
    InputSource source = new InputSource(); 
    source.setCharacterStream(new StringReader((getResources().getStringArray(R.array.flags)).toString())); 
    org.w3c.dom.Document doc = db.parse(source); // ActivityQuizScreen.java:253 is about here 
    NodeList nodes = doc.getElementsByTagName("item"); 
    for(int i = 0; i< nodes.getLength();i++) 
    {    
     NamedNodeMap attr = nodes.item(i).getAttributes(); 

     String name = attr.getNamedItem("name").getNodeValue(); 
     String CountryCode = attr.getNamedItem("pic").getNodeValue().toLowerCase(); 
    int pic = getResources().getIdentifier(CountryCode, "drawable", getPackageName()); 
    Flag flag = new Flag(
      attr.getNamedItem("name").getNodeValue(), 
      getResources().getIdentifier(CountryCode, "drawable", getPackageName())); 
    flagList.add(flag); 

    } 

数组列表文件是这样的:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="flags"> 
    <item pic="AF" name="Afghanistan" /> 
    <item pic="AL" name="Albania" /> 
    <item pic="DZ" name="Algeria" /> 
    <item pic="AS" name="American Samoa" /> 
    <item pic="AD" name="Andorra" /> 
    :    :    : 
    <item pic="YE" name="Yemen" /> 
    <item pic="ZM" name="Zambia" /> 
    <item pic="ZW" name="Zimbabwe" /> 
    <item pic="AX" name="Åland Islands" /> 

</string-array> 
</resources> 

我怎样才能解决这个问题,还是有更好的解决方案,以从文件加载arrayl列表?任何plzzzzzz?

谢谢!

+1

你应该了解在Android上的资源,你的代码是相当奇怪的 – 2016-07-07 18:19:52

+0

你的意思source.setCharacterStream(新StringReader((getResources ().getStringArray(R.array.flags))。toString()))我可以如何正确使用该资源? – Sarah

回答

0

1)你需要创建一个文件夹资产: Where do I place the 'assets' folder in Android Studio?

2)添加此XML文件(实例名称:在flag_array.xml)您资产文件夹:

资源>

<string-array name="flags"> 
    <item pic="AF" name="Afghanistan" /> 
    <item pic="AL" name="Albania" /> 
    <item pic="DZ" name="Algeria" /> 
    <item pic="AS" name="American Samoa" /> 
    <item pic="AD" name="Andorra" /> 
    <item pic="YE" name="Yemen" /> 
    <item pic="ZM" name="Zambia" /> 
    <item pic="ZW" name="Zimbabwe" /> 
    <item pic="AX" name="Åland Islands" /> 
</string-array> 

/资源>

3)本替换的addflags代码()方法:

ArrayList<Flag> flagList = new ArrayList<Flag>(); 
    DocumentBuilder db = null; 
    try { 

     db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     AssetManager assetManager = getAssets(); 
     InputStream is = assetManager.open("flag_array.xml"); 
     org.w3c.dom.Document doc = db.parse(is); 
     NodeList nodes = doc.getElementsByTagName("item"); 
     for(int i = 0; i< nodes.getLength();i++) { 
      NamedNodeMap attr = nodes.item(i).getAttributes(); 

      String name = attr.getNamedItem("name").getNodeValue(); 
      String CountryCode = attr.getNamedItem("pic").getNodeValue().toLowerCase(); 

      int pic = getResources().getIdentifier(CountryCode, "drawable", getPackageName()); 
      Flag flag = new Flag(
        attr.getNamedItem("name").getNodeValue(), 
        getResources().getIdentifier(CountryCode, "drawable", getPackageName())); 
      flagList.add(flag); 
     } 

    } catch (ParserConfigurationException e) { 
     e.printStackTrace(); 
    } catch (SAXException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

谢谢你的回答!但我想把它放在值为多语言的目的,我怎么能保持它的价值? – Sarah

+0

我为多语言目的创建了另一个答案。 :) –

0

它看起来像你试图对java字符串数组执行XML解析。 我相信你正在寻找的东西,如:

ArrayList<String> flagList = new ArrayList<String>(Arrays.asList(getResources().getStringArray(R.array.flags))); 
0
For multi-language purposes: 

1) You need to create an assets folder: http://stackoverflow.com/questions/18302603/where-to-place-assets-folder-in-android-studio. 

2) Add this xml file (Example name: flag_array.xml) in your assets folder: 

resources> 
    <string-array name="flags"> 
     <item pic="AF" name="Afghanistan" /> 
     <item pic="AL" name="Albania" /> 
     <item pic="DZ" name="Algeria" /> 
     <item pic="AS" name="American Samoa" /> 
     <item pic="AD" name="Andorra" /> 
     <item pic="FR" name="French" /> 
     <item pic="ES" name="Spanish" /> 
     <item pic="YE" name="Yemen" /> 
     <item pic="ZM" name="Zambia" /> 
     <item pic="ZW" name="Zimbabwe" /> 
     <item pic="AX" name="Åland Islands" /> 
    </string-array> 
/resources> 

3) In res folder, you need to create the values folders for each language: Example: values-es, values-fr, and in each value folder you need to create a xml with the strings that you want to translate. 

4) In your ActivityQuizScreen Class, you can add a ListView: 

     ListView listView = (ListView) findViewById(R.id.lvItems); 


    And in the XML: 

    <!--multiLanguageTextView is used to show the change in the languages--> 
    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/multiLanguageTextView" 
     android:padding="32dp" 
     android:text="@string/title" /> 

    <ListView 
     android:layout_below="@+id/multiLanguageTextView" 
     android:id="@+id/lvItems" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:visibility="visible"/> 




5) Replace your code in the addflags() method with this: 

     ArrayList<Flag> flagList = new ArrayList<Flag>(); 
     DocumentBuilder db = null; 
     try { 

      db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
      AssetManager assetManager = getAssets(); 
      InputStream is = assetManager.open("flag_array.xml"); 
      org.w3c.dom.Document doc = db.parse(is); 
      NodeList nodes = doc.getElementsByTagName("item"); 
      for(int i = 0; i< nodes.getLength();i++) { 
       NamedNodeMap attr = nodes.item(i).getAttributes(); 

       String name = attr.getNamedItem("name").getNodeValue(); 
       String CountryCode = attr.getNamedItem("pic").getNodeValue().toLowerCase(); 

       int pic = getResources().getIdentifier(CountryCode, "drawable", getPackageName()); 
       Flag flag = new Flag(
         name, 
         CountryCode, 
         pic); 
       flagList.add(flag); 
      } 


      //Set ListView Custom Adapter 
      FlagAdapterItem adapter = new FlagAdapterItem(MainActivity.this, flagList); 
      listView.setAdapter(adapter); 

6) Custom Flag Adapter 

public class FlagAdapterItem extends ArrayAdapter<Flag> { 

    private Context context; 
    private ArrayList<Flag> list; 


    public FlagAdapterItem(Context context, ArrayList<Flag> list){ 
     super(context, 0, list); 
     this.context = context; 
     this.list = list; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final Flag flagEntity = list.get(position); 

     if (convertView == null) 
     convertView = LayoutInflater.from(context).inflate(R.layout.row_item, parent, false); 

     TextView tvCountryName = (TextView)convertView.findViewById(R.id.tvCountryName); 
     tvCountryName.setText(flagEntity.getName()); 

     convertView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       setLocale(flagEntity.getCountryCode()); 
      } 
     }); 

     return convertView; 
    } 


    //Method to change the user LOCALE value (Example: fr, es) 
    //After change it, the app going to read from de selected Locale automatically 
    // (Example: values-es, values-fr). 

    public void setLocale(String lang) { 
     Locale myLocale = new Locale(lang); 
     Resources res = context.getResources(); 
     DisplayMetrics dm = res.getDisplayMetrics(); 
     Configuration conf = res.getConfiguration(); 
     if (!conf.locale.getLanguage().equals(lang)) { 
      conf.locale = myLocale; 
      res.updateConfiguration(conf, dm); 

      //Refresh actual activity but you can go to the next activity 
      ((Activity) context).finish(); 
      context.startActivity(((Activity) context).getIntent()); 
     } 
    } 
} 


7) FlagAdapterItem xml Layout 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/tvCountryName" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="tvCountryName" /> 
</LinearLayout>