【问题标题】:Create multiple layouts from JSON从 JSON 创建多个布局
【发布时间】:2013-06-02 19:26:07
【问题描述】:

我正在尝试解析来自PHP 文件的JSON 响应,然后使用该数据在布局内创建一系列RadioButton、EditText、CheckBox 和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,请询问。

编辑
根据建议编辑了我的帖子。谢谢@Ken Wolf。错误消失了,但现在我的片段是空白的。

【问题讨论】:

    标签: android json parsing android-asynctask


    【解决方案1】:

    您是对的,您不应该更改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 类对您和您的数据更有意义。

    【讨论】:

    • 这绝对是我没有想到的可能性。您愿意尝试为此编写代码吗?
    • 确实,您希望我创建一个返回 Result 的 method 并使范围覆盖我的 if-else 语句。现在这是来自javax.transform.xml 库的Result,对吗?
    • 好吧,Result 会是您自己制作的类,而不是来自任何现有库 - 负责封装您需要的所有数据。因此,它是一个具有字符串字段等的类,无论您需要什么。它的唯一目的是保存信息供您以后访问。随便你怎么称呼它:)
    • 您需要在所有视图上设置布局参数。 (stackoverflow.com/questions/2395769/…)
    • 见@torbenkohlmeier 的回答。您没有使用您构建的Result..您需要将 AsyncTask 更改为extends AsyncTask&lt;String, String, Result&gt; 并返回结果...当前您返回null...
    【解决方案2】:

    您在 onPostExecute 中创建了一个新的(空)Result 对象。您需要使用您在 doInBackground 中创建的 Result 对象,例如通过在 AsyncTasc 中添加一个 Result 字段,在 doInBackground 中分配它并在 onPostExecute 中使用它。

    编辑:如果你在inPostExecute中没有使用参数file_url,你应该把它改为Result,并在doInBackground中返回结果对象。

    【讨论】:

      猜你喜欢
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      相关资源
      最近更新 更多