根据屏幕分辨率以编程方式创建视图

时间:2016-04-13 21:01:00

标签: java android view size

我创建了一个实现ListAdapter的BaseAdapter。此BaseAdapter读取JSON文件并填充我的ListView,为自定义布局充气。

在这个JSON文件中,我有一个布尔值(active = true或active = false)。如果active为true,我会自动调整自定义布局,一切正常,但如果active为false,我需要在此自定义布局中创建一个新视图。这是我的代码:

if (!active) {
    JSONObject notifications = jsonData.getJSONObject("notifications");
    String message = notifications.getString("message");

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
    params.height = 70;

    TextView warning = new TextView(Controller.getContext());
    warning.setText(message);
    warning.setTextColor(Color.WHITE);
    warning.setBackgroundColor(Color.RED);
    warning.setGravity(Gravity.CENTER);
    warning.setPadding(10, 0, 10, 0);
    warning.setLayoutParams(params);

    // contentFrame is a RelativeLayout where the view is created;
    viewHolder.contentFrame.getLayoutParams().height = 320;
    viewHolder.contentFrame.addView(warning);
 }

我的问题是:

params.height = 70;
viewHolder.contentFrame.getLayoutParams().height = 320;

我说我的TextView高70像素,而我的RelativeLayout现在高320像素。

我的手机看起来很不错,但如果我在手机上测试其他分辨率,它看起来会不一样吗?

有没有办法根据屏幕分辨率创建视图并定义高度或宽度?也许创建视图10%的屏幕分辨率大小?这是一个很好的实践吗?对于这样的事情,最好的方法是什么?

3 个答案:

答案 0 :(得分:2)

不使用硬编码像素值,而是使用DP。 DP占设备密度,因此无论应用运行哪个设备,视图看起来都非常相似。

有关其他信息,请参阅this

因此,请在dimens.xml中定义:

<resources>
    <dimen name="my_width">320dp</dimen>
</resources>

然后这样读:

int width =  getResources().getDimensionPixelSize(R.dimen.my_width);

答案 1 :(得分:1)

您可以在XML like any other resource中定义维度,并根据当前设备配置自动选择这些资源。

所以你有两个定义,一个用于“正常”情况,另一个用于“更大屏幕”:

src/main/res/values/dimens.xml
src/main/res/values-sw600dp/dimens.xml

每个资源文件可以在dp中定义相同的维度。 Android将选择合适的一个。如果您需要以编程方式将值读取为原始像素大小,则可以使用Resources.getDimensionPixelSize()

执行此操作

我建议不要尝试按照屏幕大小的百分比来定义列表项。

答案 2 :(得分:1)

您必须根据屏幕密度缩放尺寸值:

float density = getResources().getDisplayMetrics().density;

这意味着您必须将所有尺寸值乘以density

params.height = (int)(70 * density);
viewHolder.contentFrame.getLayoutParams().height = (int)(320 * density);

与填充值相同:

warning.setPadding((int)(10 * density), 0, (int)(10 * density), 0);