我创建了一个实现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%的屏幕分辨率大小?这是一个很好的实践吗?对于这样的事情,最好的方法是什么?
答案 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);