0

JSONファイルからの応答を解析し、PHPそのデータを使用して一連のRadioButtonEditTextCheckBox、およびDropDownMenu要素をレイアウト内に作成しようとしています。つまり、動的または「オンザフライ」レイアウトです。現在必要なものを受け取ってJSONいますが、アプリがクラッシュしています。

非同期タスク

    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気軽にお尋ねください。

編集
提案から投稿を編集しました。ありがとう@ケン・ウルフ。エラーはなくなりましたが、フラグメントが空白になりました。

4

2 に答える 2

3

そうです、 で UI を変更するべきではありません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クラスをあなたとあなたのデータにとってより意味のあるものにしてください。

于 2013-06-02T19:31:56.630 に答える
1

onPostExecute で新しい (空の) Result オブジェクトを作成します。doInBackground で作成した Result オブジェクトを使用する必要があります。たとえば、AsyncTasc に Result フィールドを追加し、それを doInBackground に割り当てて、onPostExecute で使用します。

編集: inPostExecute でパラメーター file_url を使用していない場合は、それを Result に変更し、doInBackground で結果オブジェクトを返す必要があります。

于 2013-06-02T20:31:00.300 に答える