2010-11-24 11 views
0

国とその国コードを含むこの.xmlファイルがあります。今、私は人々がリストのうちの一つの国を選びたいXMLを解析し、AndroidのAlertDialogに表示します。

<?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> 

:これは、それがどのように見えるかです。私はAlertDialogはすべてを表示するのがいいだろうが。

私は私のxmlファイルから値を取得する方法は、このようなものです:

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; 
} 

そして私は私の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(); 
    } 

この場合、私は知りませんDDMSは、ログを記録するときに、バイトコードなどを返します。その後、ArrayStoreExceptionのために強制終了します..

私の質問は次のとおりです。これを行うにはこれが最善の方法ですか?はいの場合は、どうすればArrayStoreExceptionを修正できますか?いいえ、私のユーザーに国を選択させる良い方法は何でしょうか? さらに、タップした国の登録方法を教えてください。

EDIT:

私は少し下のサンプルコードを変更し、私は今、NullPointerExceptionが取得..

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)); 
     } 
    }); 
} 

NullPointerExceptionがおそらくAlertDialogを拡張し、それを与えることができるlist.setAdapter(arrAdapter);

+1

(ListView)findViewById(R.layout.lijstview)がnullを返しています。 R.id.lijstviewです。 – techiServices

+0

レイアウトフォルダにlijstview.xmlを作成しましたが、Eclipseでエラーが表示されることはありません。 R.id.lijstviewをそこに置くとエラーが出るのですが。 – Galip

+0

まずレイアウトをonCreateで設定する必要があります。私は下の私の答えを編集します。 – Zarah

答えて

1

ListViewを使用してレイアウトを作成し、そのレイアウトをonCreateに設定します。リストを作るために、あなたのような何かを行うことができます:

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();  
} 

}

ユーザーが項目を選択すると、あなたは配列内のアイテムの位置が示されていることをログで確認することができます。

あなたのレイアウトファイルのようなものすることができ

<?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

私の質問に編集を参照してください.. – Galip

+0

私の答えを編集しました。 – Zarah

0

でありますListViewを表示します。次にListViewArrayListを使用するListAdapterにバインドします。

編集:

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

それにもかかわらずよりも少し仕事があります。 viewidListViewの各項目を表すView)を指定する必要があります。

sdkリファレンスは非常に優れています。

+0

あなたは私があなたがそこに言っていることを理解していないので、それを行う方法を教えてもらえますか? – Galip

+0

誰もが自由なコードを望んでいます... 5分を与えてください。 – techiServices

+0

サンプルコードが必要です。私はちょうどあなたが言っていることを理解していないので、私は例を求めます。 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(); 

注:

.setSingleChoiceItems(CharacterSequnce []、0、以下に述べる太字のためThis link to Apiを参照してください。新しいDialogInterface.OnClickListener()....

これが役に立ちます。ありがとう:)

関連する問題