2011-12-22 63 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