【问题标题】:Android - Creating Views dynamically does not work as expectedAndroid - 动态创建视图无法按预期工作
【发布时间】:2015-06-05 16:20:43
【问题描述】:

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

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

.

这是我使用的编码

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;
}
}

【问题讨论】:

  • View 的高度是固定的 (40),但像素密度在所有设备上并不相同。也许您需要根据屏幕密度动态计算高度?

标签: java android json view


【解决方案1】:

您正在像这样设置View 的高度:

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

没有关于这个构造函数的文档,但是 LinearLayout.LayoutParams (int width, int height, float weight) 的 javadoc 说如下:

参数

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

height 高度,可以是 MATCH_PARENT, WRAP_CONTENT 或以像素为单位的固定大小

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

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

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多