我有一个包含38个字段的输入表单 我知道这太多了,但我的老板希望它像那样
有4个编辑文本和微调器作为其余部分,1个imageView将使用http客户端上传到服务器
我使用AsyncTask发送如下数据:
new asyncTask().execute(array, array, array);
因为项目太多,我想我错过了其中一项
我已经多次检查过了,但我仍然得到了indexOutOfBounds
异常
你能帮我找到它们或给我解决方案/建议来制作更简单的代码
这是代码(你的眼睛可能会受伤,因为它是整个代码):
(这里写的太多了)
为什么我使用字母表作为变量的名称? 如果我为他们每个人使用名字,我将会死。
之前谢谢
答案 0 :(得分: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
答案 1 :(得分:1)
为了让您的代码和变量更易于管理,我强烈建议您使用使用字段名称的HashMaps
(例如a
,b
,c
等。在你的代码中)作为键:
HashMap<String, String> fieldValues = new HashMap<String, String>();
HashMap<String, Spinner> fieldSpinners = new HashMap<String, Spinner>();
您可以通过迭代HashMap
中的键并在每次迭代期间执行相同的逻辑(而不是复制/粘贴)来大幅减少代码复制(以及代码复制带来的错误)每个字段的代码行相同。)
另外,我建议使用更有意义的字段名称。它可能不会像现在这样产生紧凑的代码,但从长远来看它将更容易阅读和维护。
答案 2 :(得分: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);
然后将Spinner内容放在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");
我不知道每个Spinner是否都有不同的内容。 如果他们这样做,您可以声明不同的适配器或从资源创建它。 然后添加所需的所有微调器:
for(int i=0;i<35;i++){
Spinner s = new Spinner(this);
s.setAdapter(adapter);
s.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
Spinner s = (Spinner) parent;
String selectedItem = (String) s.getSelectedItem();
Toast.makeText(InflateCoba.this, selectedItem, Toast.LENGTH_SHORT).show();
// or you can assign it to a variable
// selectedStr[i] = selectedItem;
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
inflatedLayout.addView(s);
}
设为主视图
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]));
}
....