Android:如何在代码中获取"listPreferredItemHeight"属性的值?

ab1*_*b11 17 android

以下代码给出 Resources$NotFoundException

TypedValue value = new TypedValue();
((Activity)context).getResources().getValue(android.R.attr.listPreferredItemHeight, value, true);
Run Code Online (Sandbox Code Playgroud)

编辑:响应答案添加了更多代码.

当我运行以下代码时,所有成员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);
Run Code Online (Sandbox Code Playgroud)

Fem*_*emi 32

这有效:

TypedValue value = new TypedValue();
((Activity)context).getTheme().resolveAttribute(android.R.attr.listPreferredItemHeight, value, true);
Run Code Online (Sandbox Code Playgroud)

编辑:你得到零,因为没有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);
Run Code Online (Sandbox Code Playgroud)

在我的Nexus 1上s64.0dip并且ret96.


kew*_*ang 9

另一个答案

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);
}
Run Code Online (Sandbox Code Playgroud)

它可能更有用.


Gar*_*son 8

费米的回答非常有帮助.我不想贬低他的答案,而是采用了逻辑并将其置于图书馆便利方法中,你应该能够即插即用.我计划随着时间的推移用其他属性方法更新代码.我希望它证明对某人有用.

(注意,我发现Resources.getDisplayMetrics()似乎是一种更简单的方法来返回显示指标而不是查询WindowManager.)