2013-06-02 68 views
0

創建多個佈局我試圖解析從PHP文件JSON響應,然後利用這些數據創造了一系列RadioButtonEditTextCheckBox和佈局內DropDownMenu元素。換句話說,動態或「即時」佈局。我目前收到我需要的JSON,但應用程序崩潰。從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。錯誤消失了,但現在我的片段是空白的。

回答

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類更有意義的你和你的數據。

+0

這絕對是我沒有想到的可能性。你會不會考慮爲此編寫代碼? –

+0

剛剛編輯:)讓我知道如果這是有道理 –

+0

它確實,你希望我本質上創建一個'方法',返回'結果',並使範圍覆蓋我的'if-else'語句。現在,這是'javax.transform.xml'庫中的'Result',對嗎? –

1

您在onPostExecute中創建一個新的(空)結果對象。您需要使用您在doInBackground中創建的Result對象,例如通過在AsyncTasc中添加一個Result字段,將它分配到doInBackground中並在onPostExecute中使用它。

編輯:如果您在inPostExecute中沒有使用參數file_url,則應將其更改爲Result並返回doInBackground中的結果對象。

+0

非常感謝 –