Stack OverFlow Error在Android中动态生成表单时

时间:2014-04-14 07:54:32

标签: android recursion stack-overflow

我有一个用于从json动态创建所有视图的类。如下

class Widget{
public static View createEditText(Context ctx,String hint,String hint_color,String text_color,String bg_color,String input_type,LinearLayout.LayoutParams params){
        EditText et=new EditText(ctx);
        et.setHint(hint);
        if(input_type.equals("password")){
            et.setTransformationMethod(PasswordTransformationMethod.getInstance());
        }else
            if(input_type.equals("email")){
                et.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);
            }else
                if(input_type.equals("number")){
                    et.setInputType(InputType.TYPE_CLASS_NUMBER);
                }else if(input_type.equals("text")){
                    et.setInputType(InputType.TYPE_CLASS_TEXT);
                }else if(input_type.equals("date")){
                    et.setInputType(InputType.TYPE_CLASS_DATETIME);
                }
        et.setTextColor(Color.parseColor(text_color));
        et.setHintTextColor(Color.parseColor(hint_color));
        et.setBackgroundColor(Color.parseColor(bg_color));
        et.setLayoutParams(params);
        return et;
    }
}

像这样我有更多类似的方法来保留像label和amp;当我从我的活动中调用这些方法时,抛出 Stack OverFlow Error

else if (container.getView_type().equals("textfield")) {
        if(container.getWeight() == 0.0){
            ll.addView(Widget.createEditText(getActivity(), container.getView_hint(), container.getHint_color(), container.getColor_text(), container.getColor_bg(), container.getInputType(), setParams(container.getWidth(), container.getHeight(),container.getMargins())));
        }else{
            ll.addView(Widget.createEditText(getActivity(), container.getView_hint(), container.getHint_color(), container.getColor_text(), container.getColor_bg(), container.getInputType(), setParams(container.getWidth(), container.getHeight(),container.getMargins(),container.getWeight())));
        }
    }

我的日志如下

> 04-14 03:18:49.352: E/AndroidRuntime(1363): FATAL EXCEPTION: main
04-14 03:18:49.352: E/AndroidRuntime(1363): java.lang.StackOverflowError
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.view.View.invalidate(View.java:10494)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.widget.TextView.invalidateRegion(TextView.java:4543)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.widget.TextView.invalidateCursor(TextView.java:4534)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.widget.TextView.spanChange(TextView.java:7412)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:9103)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:979)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:688)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.text.Selection.setSelection(Selection.java:76)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.text.Selection.setSelection(Selection.java:87)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:302)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.widget.TextView.setText(TextView.java:3759)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.widget.TextView.setText(TextView.java:3629)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.widget.EditText.setText(EditText.java:80)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.widget.TextView.<init>(TextView.java:1266)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.widget.EditText.<init>(EditText.java:60)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.widget.EditText.<init>(EditText.java:56)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at android.widget.EditText.<init>(EditText.java:52)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.javaclasslist.Widget.createEditText(Widget.java:94)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:391)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Fragment.createForm(NewTrip_Fragment.java:414)
04-14 03:18:49.352: E/AndroidRuntime(1363):     at com.demo.dynamic.activitylist.NewTrip_Frag

我正在调用创建每个视图的相同方法。因为我有切换案例,检查视图类型&amp;调用相同的方法。

编辑1: CreateForm代码:

View createForm(final Container container){
    LinearLayout ll;
    String id=container.getId();
    ll=new LinearLayout(getActivity());
    ll.setBackgroundColor(Color.parseColor("#ffffff"));
    ll.setOrientation(LinearLayout.VERTICAL);

    if(container.getView_type().equals("label")){
        if(container.getWeight() == 0.0){
            ll.addView(Widget.createTextView(getActivity(), container.getColor_text(), container.getColor_bg(), container.getView_text(), setParams(container.getWidth(), container.getHeight(),container.getMargins()), container.getText_size()));
        }else{
            ll.addView(Widget.createTextView(getActivity(), container.getColor_text(), container.getColor_bg(), container.getView_text(), setParams(container.getWidth(), container.getHeight(),container.getMargins(),container.getWeight()), container.getText_size()));  
        }
    }else if (container.getView_type().equals("textfield")) {
        if(container.getWeight() == 0.0){
            ll.addView(Widget.createEditText(getActivity(), container.getView_hint(), container.getHint_color(), container.getColor_text(), container.getColor_bg(), container.getInputType(), setParams(container.getWidth(), container.getHeight(),container.getMargins())));
        }else{
            ll.addView(Widget.createEditText(getActivity(), container.getView_hint(), container.getHint_color(), container.getColor_text(), container.getColor_bg(), container.getInputType(), setParams(container.getWidth(), container.getHeight(),container.getMargins(),container.getWeight())));
        }
    }else if (container.getView_type().equals("button")) {
        if(container.getOnClick().equals("popup")){
            LinearLayout ll_child = null;
            if(container.getContainChild()==false){
                if(container.getWeight() == 0.0){
                    ll.addView(Widget.createButton(getActivity(), container.getView_text(), container.getColor_text(), container.getColor_bg(), setParams(container.getWidth(), container.getHeight(),container.getMargins()), container.getOnClick(),container.getDialog_title()));
                }else{
                    ll.addView(Widget.createButton(getActivity(), container.getView_text(), container.getColor_text(), container.getColor_bg(), setParams(container.getWidth(), container.getHeight(),container.getMargins(),container.getWeight()), container.getOnClick(),container.getDialog_title()));
                }
            }else{
                for(int j=0;j<containerList.size();j++){
                    if(id.equals(container_child=containerList.get(j)))
                        continue;
                    ll_child=new LinearLayout(getActivity());
                    ll_child.setBackgroundColor(Color.parseColor("#ffffff"));
                    ll_child.setOrientation(LinearLayout.VERTICAL);
                    if(containerList.get(j).getId().contains(id)){
                        container_child=containerList.get(j);
                        ll_child.addView(createForm(container_child));
                        if(container.getWeight() == 0.0){
                            ll.addView(Widget.createButton(getActivity(), container.getView_text(),container.getColor_text(),container.getColor_bg(), setParams(container.getWidth(), container.getHeight(),container.getMargins()), container.getOnClick(), container.getDialog_title(), ll_child,"vertical"));
                        }else{
                            ll.addView(Widget.createButton(getActivity(), container.getView_text(),container.getColor_text(),container.getColor_bg(), setParams(container.getWidth(), container.getHeight(),container.getMargins(),container.getWeight()), container.getOnClick(), container.getDialog_title(), ll_child,"vertical"));
                        }
                    }
                }

            }
        }
        else if(container.getOnClick().equals("accordion")){
            if(container.getWeight() == 0.0){
                ll.addView(Widget.createButton(getActivity(), container.getView_text(), container.getColor_text(), container.getColor_bg(), setParams(container.getWidth(), container.getHeight(),container.getMargins())));
            }else{
                ll.addView(Widget.createButton(getActivity(), container.getView_text(), container.getColor_text(), container.getColor_bg(), setParams(container.getWidth(), container.getHeight(),container.getMargins(),container.getWeight())));  
            }
            final LinearLayout ll_child=new LinearLayout(getActivity());
            ll_child.setBackgroundColor(Color.parseColor("#ffffff"));
            ll_child.setOrientation(LinearLayout.VERTICAL);
            for(int j=0;j<containerList.size();j++){
                if(id == containerList.get(j).getParentId()){
                    container_child=containerList.get(j);
                    ll_child.addView(createForm(container_child));
                }
            }
            ll.addView(ll_child);
            ll_child.setVisibility(View.GONE);
            ll.getChildAt(0).setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    //Toast.makeText(getActivity(), "ll_child 0",Toast.LENGTH_LONG).show();
                    flag++;
                    if(container_child.getView_type().equals("datepickerdialog")){
                        Widget.createDatePickerDialog(getActivity());
                    }else{
                        if(flag == 1){
                            ll_child.setVisibility(View.VISIBLE);
                        }
                        if(flag == 2){
                            flag=0;
                            ll_child.setVisibility(View.GONE);
                        }
                    }
                }
            });
        }
    } 
    else if(container.getView_type().equals("select")){
        Spinner spinner = null;
        if(container.getWeight() == 0.0){           
            spinner=(Spinner) Widget.createSpinner(getActivity(), container.getSpinner_choices(),setParams(container.getWidth(), container.getWidth(), container.getMargins()),container.getColor_bg(),container.getColor_text());
        }else{
            spinner=(Spinner) Widget.createSpinner(getActivity(), container.getSpinner_choices(),setParams(container.getWidth(), container.getWidth(), container.getMargins(),container.getWeight()),container.getColor_bg(),container.getColor_text());
        }
        ll.addView(spinner);
        spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                    int position, long id) {
                if(position > 0){
                    Toast.makeText(getActivity(), ""+container.getSpinner_choices_db()[position], Toast.LENGTH_SHORT).show();
                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
    }
    else if(container.getView_type().equals("layout")){
        LinearLayout ll_temp = null;
        if(container.getWeight()== 0.0){
            ll_temp=(LinearLayout) Widget.createLinearLayout(getActivity(), container.getOrientation(), container.getColor_bg(),setParams(container.getWidth(), container.getHeight(), container.getMargins()));
        }else{
            ll_temp=(LinearLayout) Widget.createLinearLayout(getActivity(), container.getOrientation(), container.getColor_bg(),setParams(container.getWidth(), container.getHeight(), container.getMargins(),container.getWeight()));
        }
        if(container.getContainChild() == true){
            for(int j=0;j<containerList.size();j++){
                if(id == containerList.get(j).getParentId()){
                    container_child=containerList.get(j);
                    ll_temp.addView(createForm(container_child));
                }
            }
            ll.addView(ll_temp);
        }
    }
    else if(container.getView_type().equals("datepicker")){

        DatePicker.OnDateChangedListener listener=new OnDateChangedListener() {

            @Override
            public void onDateChanged(DatePicker view, int year, int monthOfYear,
                    int dayOfMonth) {
                Toast.makeText(getActivity(), ""+view.getYear()+"/"+(monthOfYear+1)+"/"+dayOfMonth, Toast.LENGTH_SHORT).show();                 
            }
        };
        Calendar c=Calendar.getInstance();
        int year_c=c.get(Calendar.YEAR);
        int month_c=c.get(Calendar.MONTH);
        int day_c=c.get(Calendar.DAY_OF_MONTH);
        if(container.getWeight() == 0.0){
            datePicker=(DatePicker) Widget.createDatePicker(getActivity(), year_c, month_c, day_c,container.getColor_bg(), setParams(container.getWidth(), container.getHeight(), container.getMargins()),listener);
        }else{
            datePicker=(DatePicker) Widget.createDatePicker(getActivity(), year_c, month_c, day_c, container.getColor_bg(),setParams(container.getWidth(), container.getHeight(), container.getMargins(),container.getWeight()),listener);
        }
        ll.addView(datePicker);
    }
    else if(container.getView_type().equals("checkbox_boolean")){
        CheckBox cb=(CheckBox)Widget.createcheckBoxBoolean(getActivity(), container.getView_text(),container.getColor_text(),container.getColor_bg(),container.getText_size(),setParams(container.getWidth(), container.getHeight(), container.getMargins()));
        ll.addView(cb);
        cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked == true){
                    Toast.makeText(getActivity(), "true", Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(getActivity(), "false", Toast.LENGTH_SHORT).show();  
                }
            }
        });
    }
    else if(container.getView_type().equals("AutoCompleteSelectWidget")){
        AutoCompleteTextView atv=(AutoCompleteTextView) Widget.createAutoCompleteEditText(getActivity(), container.getView_hint(), container.getHint_color(), container.getColor_text(), container.getColor_bg(), container.getInputType(), setParams(container.getWidth(), container.getHeight(), container.getMargins()),container.getThreshold());
        atv.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(container.getSearch_type().equals("trip")){
                    Toast.makeText(getActivity(), ""+s.toString(), Toast.LENGTH_SHORT).show();
                }

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub

            }
        });
        ll.addView(atv);
    }
    return ll;
}

1 个答案:

答案 0 :(得分:0)

原因是您从createForm()内部呼叫createForm()。这导致程序进入无限(无限)循环,因此StackOverflow异常。

看看这里:

enter image description here