2010-11-24 9 views
0

J'ai ce fichier .xml avec les pays et leurs codes de pays dans eux. Voici à quoi cela ressemble:Analyser XML et l'afficher dans un AlertDialog dans Android

<?xml version="1.0" encoding="UTF-8"?> 
<landen> 
<land> 
    <naam>Afghanistan</naam> 
    <code>AF</code> 
</land> 
<land> 
    <naam>Albani�</naam> 
    <code>AL</code> 
</land> 
<land> 
    <naam>Algerije</naam> 
    <code>DZ</code> 
</land> 
<land> 
</landen> 

Maintenant, je veux que les gens choisissent un pays dans une liste. Je pense qu'un AlertDialog serait bien d'afficher tout.

La façon dont je reçois les valeurs de mon fichier XML est comme ceci:

protected ArrayList<Land> getLanden() { 
    ArrayList<Land> lijst = new ArrayList<Land>(); 
    try { 
     DocumentBuilder builder =DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     Document doc = builder.parse(getAssets().open("landenlijst.xml")); 
     NodeList nl = doc.getElementsByTagName("land"); 
     for (int i=0;i<nl.getLength();i++) { 
      Node node = nl.item(i); 

      Land land = new Land(); 

      land.land = Xml.innerHtml(Xml.getChildByTagName(node, "naam")); 
      land.landcode = Xml.innerHtml(Xml.getChildByTagName(node, "code")); 
      lijst.add(land); 
     } 
     Log.d("Gabug","Klaar met parsen"); 
     Log.d("Gabug","Landen: " + lijst); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return lijst; 
} 

Et je l'utiliser pour faire mon AlertDialog:

public void KiesLandMenu(){ 
     ArrayList<Land> alleLanden = getLanden(); 
     final CharSequence[] items = alleLanden.toArray(new CharSequence[alleLanden.size()]); 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setTitle("Kies land"); 
     builder.setItems(items, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int item) { 
       switch (item){ 
        case 0: 
         break; 
        case 1: 
         break; 
        case 2: 
         break; 
       } 
      } 
     }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 

Je ne sais pas si cela fonctionne comme DDMS retourne un bytecode ou quelque chose quand je le connecte. Et après cela, Force se ferme à cause de ArrayStoreException ..

Maintenant, ma question est; Est-ce la meilleure façon de faire cela? Si oui, comment puis-je corriger l'exception ArrayStoreException? Si non, quelles sont les meilleures façons de laisser mon utilisateur choisir un pays (une toute nouvelle vue peut-être)? En outre, comment puis-je enregistrer le pays dans lequel quelqu'un s'est engagé?

EDIT:

Je légèrement changé l'exemple de code ci-dessous et je reçois un NullPointerException maintenant ..

public void KiesLandMenu(){ 
    ArrayAdapter<Land> arrAdapter; 
    ArrayList<Land> alleLanden = getLanden(); 
    arrAdapter = new ArrayAdapter<Land>(this, android.R.layout.simple_list_item_single_choice, alleLanden); 

    ListView list = (ListView)findViewById(R.layout.lijstview); 
    list.setAdapter(arrAdapter); 
    list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

    list.setOnItemClickListener(new OnItemClickListener() { 

     public void onItemClick(AdapterView<?> list, View view, int position, 
       long id) { 
      Log.e("item clicked", String.valueOf(position)); 
     } 
    }); 
} 

Le NullPointerException est à list.setAdapter(arrAdapter);

+1

(ListView) findViewById (R.layout.lijstview) est de retour nul. C'est R.id.lijstview. – techiServices

+0

J'ai créé lijstview.xml dans le dossier layout, et cela ne me donne pas d'erreur dans Eclipse. Alors que cela me donne une erreur quand je mets R.id.lijstview là. – Galip

+0

Vous devez configurer votre disposition dans onCreate en premier. Je vais modifier ma réponse ci-dessous. – Zarah

Répondre

1

Créez une mise en page avec ListView, puis définissez cette disposition dans votre onCreate. Pour la liste, vous pouvez faire quelque chose comme:

public class RunTestProject extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); //whatever you want your layout to be 
} 

// getLanden() implementation goes here 


public void KiesLandMenu(){ 
    ArrayList<Land> alleLanden = getLanden(); 
    arrAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice, alleLanden); 

    Dialog dialog = new Dialog(this); 
    dialog.setTitle("Kies land"); 
    dialog.setContentView(R.layout.withList); // The dialog layout 
    ListView list = (ListView) dialog.findViewById(android.R.id.list); //note that it's not simply findViewById 
    list.setAdapter(arrAdapter); 
    list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

    list.setOnItemClickListener(new OnItemClickListener() { 

     public void onItemClick(AdapterView<?> list, View view, int position, 
       long id) { 
      Log.e("item clicked", String.valueOf(position)); 
     } 
    }); 

    dialog.show();  
} 

}

Lorsque l'utilisateur choisit sur un élément, vous pouvez voir dans le journal que la position de l'élément dans le tableau est affiché.

Votre fichier de mise en page peut être quelque chose comme:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <ListView android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="0dip" 
     android:layout_weight="1" 
     /> 
</LinearLayout> 
+0

voir mon edit sur ma question .. – Galip

+0

Édité ma réponse. – Zarah

0

Vous pourriez probablement étendre AlertDialog et lui donner un ListView en vue. Puis liez le ListView à un ListAdapter qui utilise votre ArrayList.

Edit:

ListView lv = new ListView(context); 
ArrayAdapter aa = new ListAdapter(context, viewid, lijst); 
lv.setAdapter(aa); 
AlertDialog ad = new AlertDialog(context); 
ad.setView(lv); 

Il y a un peu plus de travail que si. Vous devez spécifier viewid qui correspond au View représentant chaque élément du ListView.

La référence sdk est très bonne, vous savez.

+0

Pourriez-vous peut-être me montrer comment faire cela, parce que je ne comprends pas ce que vous dites là :) – Galip

+0

Tout le monde veut le code libre ... Donnez-moi 5 min. – techiServices

+0

Je veux un code SAMPLE. Je ne comprends pas ce que vous dites, alors je demande un exemple. Jeez ... – Galip

0
new AlertDialog.Builder(this) 
      .setIcon(R.drawable.alert_dialog_icon) 
      .setTitle(R.string.alert_dialog_single_choice) 
      .setSingleChoiceItems(<ListAdapter> or CharaSequnce[] , 0, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 

        /* User clicked on a radio button do some stuff */ 
       } 
      }) 
      .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 

        /* User clicked Yes so do some stuff */ 
       } 
      }) 
      .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 

        /* User clicked No so do some stuff */ 
       } 
      }) 
      .create(); 

Note: S'il vous plaît voir This link to Api pour le texte gras mentionné ci-dessous

.setSingleChoiceItems (CharacterSequnce [], 0, new DialogInterface.OnClickListener() ....

Hope this helps. Merci :)