安卓:如何在代码中获取“listPreferredItemHeight”属性的值?

17

以下代码导致 Resources$NotFoundException 异常。

TypedValue value = new TypedValue();
((Activity)context).getResources().getValue(android.R.attr.listPreferredItemHeight, value, true);

编辑:回答中添加了更多代码。

当我运行以下代码时,displayMetrics 的所有成员都是 0。同样地,ret 也是。

TypedValue value = new TypedValue();
DisplayMetrics displayMetrics = new DisplayMetrics();
((Activity)context).getTheme().resolveAttribute(android.R.attr.listPreferredItemHeight, value, true);
float ret = value.getDimension(displayMetrics);
4个回答

32

这个有效:

TypedValue value = new TypedValue();
((Activity)context).getTheme().resolveAttribute(android.R.attr.listPreferredItemHeight, value, true);

编辑:你得到零是因为没有正确初始化 DisplayMetrics 实例。它需要一个参考框架(一个显示器)才能进行任何有意义的转换。

android.util.TypedValue value = new android.util.TypedValue();
boolean b = getTheme().resolveAttribute(android.R.attr.listPreferredItemHeight, value, true);
String s = TypedValue.coerceToString(value.type, value.data);
android.util.DisplayMetrics metrics = new android.util.DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
float ret = value.getDimension(metrics);

在我的 Nexus 1 上,s64.0dip,而ret96


谢谢,这没有引发异常。但是,我仍然无法获取属性的值。我更新了我的问题以反映这一点。 - ab11
我该如何从TypedValue中获取值为64的int?除了从coerceToString解析字符串外,我找不到其他方法。 - Juozas Kontvainis
啊,找到了!TypedValue.complexToDimensionPixelSize(value.data, metrics) - Juozas Kontvainis
你怎样从一个继承自LinearLayout的类中解析属性?似乎我无法访问getTheme(),并尝试使用context.getResources().getValue(R.styleable.my_attr, value, true);会抛出ResourcesNotFound异常。 - Snailer
请注意,在上述代码中,该方法是从构造函数 public Foo(Context context, AttributeSet attr) 中调用的。 - Snailer
如果你有上下文或者在一个片段内,获取显示度量的更简单的方法是使用以下代码:getResources().getDisplayMetrics() 或者 Context.getResources().getDisplayMetrics() - idunnololz

10

另一个答案

public float getItemHeight() {
    TypedValue value = new TypedValue();
    DisplayMetrics metrics = new DisplayMetrics();

    context.getTheme().resolveAttribute(
            android.R.attr.listPreferredItemHeight, value, true);
    ((WindowManager) (context.getSystemService(Context.WINDOW_SERVICE)))
            .getDefaultDisplay().getMetrics(metrics);

    return TypedValue.complexToDimension(value.data, metrics);
}

它可能更有用。


8

Femi的回答非常有帮助。不想贬低他的回答,我已经将逻辑放在一个库方便方法中,您应该能够即插即用。我计划随着时间的推移更新代码以包含其他属性方法。希望对某些人有用。

(请注意,我发现Resources.getDisplayMetrics()似乎是一种更容易返回显示度量的方法,而不是查询WindowManager。)


我只找到了Resources.getSystem().getDisplayMetrics();适用于当前的Android版本(4.4)。 - ATom

2

最简单的答案(不需要DisplayMetrics):

TypedValue typedValue = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.listPreferredItemHeight, typedValue, true);
int height = TypedValue.complexToDimensionPixelSize(typedValue.data, context.getResources().getDisplayMetrics());

如果删除Android前缀resolveAttribute(R.attr.listPreferredItemHeight, typedValue, true);会发生什么? - user1185087

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接