Android - 动态创建视图无法按预期工作

时间:2015-06-05 16:20:43

标签: java android json view

我正在开发一个Android应用程序,我在其中根据RadioButton响应动态创建CheckBoxEditTextjson等视图并添加到LinearLayout以编程方式使用Java。 在micromax A114中,我得到了预期的结果!  here

但是当我使用Samsung note edge进行测试时,它会崩溃并且看起来不太好。

here

这是我使用的编码

for (int dynamicViews = 0; dynamicViews < FormFieldsController
                .initializeFormFieldsController().initializeFormFields().size(); dynamicViews++){


int fieldType = Integer.parseInt(formFields.getFieldType());
switch (fieldType) {
    case VIEW_TYPE_EDIT_TEXT:
                    LinearLayout fieldLabel = new LinearLayout(context);
                    fieldLabel.setOrientation(LinearLayout.VERTICAL);

                    params = new LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.WRAP_CONTENT, 40);
                    params.setMargins(10, 10, 0, 0);

                    TextView label = new TextView(context);
                    label.setBackground(context.getResources().getDrawable(
                            R.drawable.text_area_field_title_background));

                    label.setTextColor(Color.parseColor("#FFFFFF"));
                    label.setPadding(10, 5, 10, 0);
                    label.setText(formFields.getFieldName());
                    label.setLayoutParams(params);
                    fieldLabel.addView(label);

                    params = new LinearLayout.LayoutParams(
                            LinearLayout.LayoutParams.MATCH_PARENT, 200);

                    final EditText editText = new EditText(context);
                    editText.setGravity(Gravity.CENTER);
                    params.setMargins(10, 0, 10, 10);
                    editText.setLayoutParams(params);
                    editText.setBackground(context.getResources().getDrawable(
                            R.drawable.cornerless_rc_bg));
                    editText.setHint("Type Here ...");

                    if (formFields.getCrfFormField().getFieldValue() != null) {
                        editText.setText(formFields.getCrfFormField()
                                .getFieldValue());
                    }
                    editText.addTextChangedListener(new TextWatcher() {

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

                            FormFieldsController.initializeFormFieldsController()
                                    .initializeFormFields().get(position)
                                    .getCrfFormField()
                                    .setFieldValue(editText.getText().toString());

                        }

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

                        }

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

                        }
                    });
                    fieldLabel.addView(editText);
                    container.addView(fieldLabel);

                    break;
}
}

1 个答案:

答案 0 :(得分:1)

您正在设置View的高度,如下所示:

params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 40);

此构造函数没有文档,但LinearLayout.LayoutParams (int width, int height, float weight)的javadoc说明如下:

  

参数

     

宽度宽度,MATCH_PARENT,WRAP_CONTENT或a   固定大小(以像素为单位)

     

高度,MATCH_PARENT,   WRAP_CONTENT或固定大小(以像素为单位)

这实质上意味着您使用的构造函数是像素,而不是dp。由于像素密度因设备而异,因此您需要根据屏幕密度计算运行时View的高度(以像素为单位)。您可以使用以下方法将dp转换为像素:

public int dpToPx(int dp) {
    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
    return (int)((dp * displayMetrics.density) + 0.5);
}