我有一个用于从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;
}