2011-12-22 22 views
1

對我有了38場 輸入表單我知道這是太多了,但我的老闆希望它是這樣的java.lang.ArrayIndexOutOfBoundsException的android輸入表格

有4名編輯的文本和紡紗作爲休息1個ImageView的那會使用HTTP客戶端

被上傳到服務器我用的AsyncTask發送的數據是這樣的:

new asyncTask().execute(array, array, array); 

因爲有太多的項目,我想我錯過了 我其中的一個已經c hecked很多次,但我仍然得到indexOutOfBounds例外

你能不能幫我找到他們,或給我的解決方案/建議,讓簡單的代碼

下面的代碼(你的眼睛可能會傷害怎麼把它的整個代碼):

http://pastebin.com/0dUss9ak

(這太過分了寫在這裏)我爲什麼使用字母的變量名

? 如果我爲他們每個人使用名字,我會死的。

由於之前

+3

你可以發佈stacktrace嗎? – 2011-12-22 16:58:57

回答

1

在此行中

new KirimData().execute(id_user, nama, lokasi, keterangan, a, b, c, d, e, f, g, h, i, k, l, m, n, o, p, q, ad, bd, cd, dd, ed, fd, gd, hd, id, jd, kd, ld, md, nd, od, pd, qd, savedImagePath);

你似乎缺少參數j,在

KirimData#doInBackground

+0

謝謝!我沒有看到'j'丟失:D – 2011-12-23 00:30:23

1

將(很可能)會導致異常讓你的代碼和變量更容易管理,我強烈推薦使用HashMaps使用字段名稱(即abc等在你的代碼)作爲鍵:

HashMap<String, String> fieldValues = new HashMap<String, String>(); 
HashMap<String, Spinner> fieldSpinners = new HashMap<String, Spinner>(); 

你可以大大通過在HashMap遍歷鍵減少你的代碼複製(像這樣的代碼複製導致的錯誤)和在每次迭代期間執行相同的邏輯(而不是爲每個字段複製/粘貼相同的代碼行)。

此外,我會建議使用更有意義的字段名稱。它可能不會像現在那樣產生緊湊的代碼,但從長遠來看,它更易於閱讀和維護。

+0

謝謝,我會嘗試在我的代碼上實現該HashMap :) – 2011-12-23 00:41:55

0

其實我發現了一個的onCreate惡意代碼:

File nfile = new File(Environment.getExternalStorageDirectory()+"/Android/data/com.nigmagrid.jm.demo/"); 
    nfile.mkdir(); 

爲什麼你總是創建目錄每次應用程序啓動時間?

如果你真的想把很多微調, 我建議你應該添加你的微調的方式,它以編程方式添加它。 - 首先,你可能會膨脹的主要佈局

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
    ViewGroup inflatedLayout = (ViewGroup) inflater.inflate(<your layout xml>, null); 

然後把微調內容上ArrayAdapter

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    adapter.add("Jembatan 1"); 
    adapter.add("Jembatan 2"); 
    adapter.add("Jembatan 3"); 

我不知道如果每個微調有不同的內容。如果他們這樣做,您可以聲明不同的適配器或從資源創建它。 然後添加你想要的所有微調:

​​

設定爲主要景觀

setContentView(inflatedLayout); 

上btn_proses點擊收聽,我建議你不應該創建的AsyncTask的新對象, 聲明它初始化和使用您聲明的實例。

HashMap<String, Object> kirimPaket = new HashMap<String, Object>(); 
    kirimPaket.put("nama", nama); 
    kirimPaket.put("keterangan", keterangan); // and do the rest .. 
    kirimPaket.put("spinnerItem", selectedStr); 
    kirim.execute(kirimPaket); 

其中kirim是KirimData的一個實例。 使用HashMap並把你的數據包放在那裏,它會使它變得簡單。

protected class KirimData extends AsyncTask<HashMap<String, Object>, Void, String> 

其實我不喜歡的AsyncTask發送參數的方式,谷歌應該做的簡單。 然後敲定它

@Override 
     protected String doInBackground(HashMap<String, Object>... params) { 
      try{ 
       HttpClient httpClient = CustomHttpClient.getHttpClient(); 
       HttpPost postRequest = new HttpPost(VarsUrl.getServerAddress()+"simpan-inspeksi-jembatan.php"); 

       MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
       String nama = params[0].get("nama"); 
       String keterangan = params[0].get("keterangan"); // and do the rest .. 
       String[] selectedStr = params[0].get("spinnerItem"); 

       reqEntity.addPart("nama", new StringBody(nama)); 
       reqEntity.addPart("keterangan", new StringBody(keterangan)); // and do the rest .. 
       for(int i=0;i<selectedStr.length;i++){ 
        reqEntity.addPart("item_"+i, new StringBody(selectedStr[i])); 
       } 
      .... 
+0

謝謝,我將移動目錄mkdir腳本。在微調框的循環腳本中,如何在Spinner下面添加一個TextView? 那些紡紗廠有相同的價值,他們只包含是和否 – 2011-12-23 00:41:07

+0

你應該移動該mkdir腳本或您的應用程序將崩潰,花費大量的空間。關於在他們下面添加TextView,如果你有線性佈局 - 垂直作爲你的主體,只需在添加微調器後執行'inflatedLayout.addView(textView);'。如果你有一個RelativeLayout,使用[LayoutParam](http://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams.html)來設置TextView的位置。 DONE – arufian 2011-12-23 06:50:58