我正在尝试解析来自JSON
文件的PHP
回复,然后使用该数据创建一系列RadioButton
,EditText
,CheckBox
和布局中的DropDownMenu
元素。换句话说,动态或“动态”布局。我目前正在收到我需要的JSON
但应用程序正在崩溃。
的AsyncTask
class LoadAllQuestions extends AsyncTask<String, String, String> {
private ProgressDialog pDialog;
JSONParser jParser = new JSONParser();
JSONArray questions = null;
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(getActivity());
pDialog.setMessage("Loading questions. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
protected String doInBackground(String... args) {
// getting JSON string from URL
companyName = cn.getText().toString();
projectName = pn.getText().toString();
String componentName = (String) ab.getSelectedTab().getText();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
nameValuePairs.add(new BasicNameValuePair("company", companyName));
nameValuePairs.add(new BasicNameValuePair("project", projectName));
nameValuePairs.add(new BasicNameValuePair("component",
componentName));
JSONObject json = jParser.makeHttpRequest(url, "POST",
nameValuePairs);
// Check your log cat for JSON response
Log.d("All Questions: ", json.toString());
try {
// Checking for SUCCESS TAG
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// products found: getting Array of Questions
questions = json.getJSONArray(TAG_QUESTIONS);
// looping through All Questions
for (int i = 0; i < questions.length(); i++) {
JSONObject c = questions.getJSONObject(i);
// Storing each JSON item in variable
String name = c.getString(TAG_NAME);
String field = c.getString(TAG_FIELD);
String value = c.getString(TAG_VALUE);
Result result = null;
if (field == r) {
result = new Result();
result.setType(1);
result.setName(name);
result.setField(field);
result.setValue(value);
} else {
result = new Result();
result.setType(2);
result.setName(name);
result.setField(field);
result.setValue(value);
}
}
} else {
// no products found
Log.v("ERROR", "No JSON for you!");
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
// dismiss the dialog
pDialog.dismiss();
Result result = new Result();
if (result.getType() == 1) {
LinearLayout content = (LinearLayout) view
.findViewById(R.id.genA_layout);
// create
TextView tv = new TextView(getActivity());
RadioGroup rg = new RadioGroup(getActivity());
rg.setOrientation(RadioGroup.HORIZONTAL);
RadioButton rb = new RadioButton(getActivity());
RadioButton rb2 = new RadioButton(getActivity());
LinearLayout ll = new LinearLayout(getActivity());
// set
rb.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
rb2.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
ll.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
rb.setText(result.getValue());
rb2.setText(result.getValue());
tv.setText(result.getName());
ll.setOrientation(LinearLayout.HORIZONTAL);
// add
rg.addView(rb);
rg.addView(rb2);
ll.addView(tv);
ll.addView(rg);
content.addView(ll);
} else if (result.getType() == 2) {
// find
LinearLayout content = (LinearLayout) view
.findViewById(R.id.genA_layout);
// create
TextView tv = new TextView(getActivity());
EditText et = new EditText(getActivity());
LinearLayout ll1 = new LinearLayout(getActivity());
// set
tv.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
et.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
ll1.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
tv.setText(result.getName());
ll1.setOrientation(LinearLayout.HORIZONTAL);
// add
ll1.addView(tv);
ll1.addView(et);
content.addView(ll1);
}
// find
LinearLayout loader = (LinearLayout) view
.findViewById(R.id.loader_layout);
Button save = (Button) view
.findViewById(R.id.generalAssets_save_button_ID);
// set
loader.setVisibility(View.GONE);
save.setVisibility(View.VISIBLE);
};
}
}
JSON
{
"questions": [
{
"display_name": "Store #",
"field_type": "Text Field",
"option_value": ""
},
{
"display_name": "Address",
"field_type": "Text Field",
"option_value": ""
},
{
"display_name": "Type of Business",
"field_type": "Drop Down Menu",
"option_value": "Education\r\nHealth\r\nComputers\r\nFood\r\nRetail\r\nOther"
},
{
"display_name": "Is this business good?",
"field_type": "Radio",
"option_value": "Yes\r\nNo"
},
{
"display_name": "Are they nice people?",
"field_type": "Check Box",
"option_value": "Yes\r\nNo"
}
],
"success": 1
}
结果类
public class Result {
private String name;
private String field;
private String value;
private int type;
//constructor
public Result() {
}
// <-----SET METHODS----->
public void setName(String name) {
name = this.name;
}
public void setField(String field) {
field = this.field;
}
public void setValue(String value) {
value = this.value;
}
public void setType(int type) {
type = this.type;
}
// <-----GET METHODS----->
public String getName() {
return name;
}
public String getField() {
return field;
}
public String getValue() {
return value;
}
public int getType() {
return type;
}
}
如果您希望XML
只是询问。
修改
从建议中编辑了我的帖子。谢谢@Ken Wolf。错误消失但现在我的片段是空白的。
答案 0 :(得分:3)
你说得对,你不应该改变doInBackground
中的用户界面。
你不能在某种转移对象中封装你需要的一切,相应地设置结果,并在onPostExecute
中做所有事情吗?
示例:
protected String doInBackground(String... args) {
...
Result result = null;
if (field == r) {
result = new Result();
result.setType(1);
result.setValue(value);
result.setName(name);
... // store whatever else you need
}
else {
result.setType(2);
... // store whatever else you need
}
return result;
}
protected void onPostExecute(Result result) {
if (result.getType() == 1)
// build layout
else if (result.getType() == 2)
// build layout
}
当然,让Result
课程对您和您的数据更有意义。
答案 1 :(得分:1)
您在onPostExecute中创建一个新的(空)Result对象。您需要使用在doInBackground中创建的Result对象,例如在AsyncTasc中添加Result字段,在doInBackground中分配它并在onPostExecute中使用它。
编辑:如果您没有在inPostExecute中使用参数file_url,则应将其更改为Result并在doInBackground中返回结果对象。