getHeight以dp为单位返回值吗?

时间:2016-12-09 08:28:58

标签: android listview android-linearlayout relativelayout

我正在尝试获取列表视图中项目占用的高度。所以我写了下面的代码:

mLisVieMeineDocs.post(new Runnable() {
        @Override
        public void run() {
            h = mLisVieMeineDocs.getHeight();
            Log.d(TAG, "getHeight :" + h);//returns 108

            FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mLisVieMeineDocs.getLayoutParams();
            params.width = LinearLayout.LayoutParams.MATCH_PARENT;
            params.height = h;
            mLisVieMeineDocs.setLayoutParams(params);
        }
    });

如代码中所述,“getHeight”返回108.当我尝试在xml文件中listview的容器的layout_height中设置此值“108”时,如下所示:

<LinearLayout
            android:id="@+id/versicherungsListeActivity2mod_linLay_meineDocList_container"
            android:layout_width="match_parent"
            android:layout_height="108dp"  <<<------
            android:orientation="vertical"
            android:layout_below="@+id/versicherungslistsactivity2mod_linLay_meineDocsBar_container">

            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fillViewport="true">

                <!--android:transcriptMode="alwaysScroll"
                    android:stackFromBottom="true"-->
                <ListView
                    android:id="@+id/versicherungsListeActivity2mod_lisVie_meineDocs"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"></ListView>
            </ScrollView>
        </LinearLayout>

我发现linearlayout扩展到listview despit中最多包含2个项目,上面的代码表明listview中项目的高度为108 但是,当我在xml文件中将108更改为54dp时

android:layout_height="54dp"

然后,linearlayout扩展为精确地包装在listview中的项目上。

那么,为什么“getHeight”会返回视图高度的两倍?为什么我需要将“getHeight”返回的值除以得到视图的确切高度

3 个答案:

答案 0 :(得分:0)

您需要将像素转换为dp,请参阅下面的代码。

 h = pxToDp(mLisVieMeineDocs.getHeight());

 public static int pxToDp(int px) {
    return (int) (px / Resources.getSystem().getDisplayMetrics().density);
}

public static int dpToPx(int dp) {
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
}

答案 1 :(得分:0)

Java中的大多数值都是Pixel,所以你需要改变它。

public static int dip2px(Context context, float dp) {
    float scale = context.getResources().getDisplayMetrics().density;
    return (int) (dp * scale + 0.5f);
}

public static int px2dip(Context context, float px) {
    float scale = context.getResources().getDisplayMetrics().density;
    return (int) (px / scale + 0.5f);
}

有时你应该设置DP / SP值,例如: badgeCountTv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);

TypedValue.COMPLEX_UNIT_DIP, TypedValue.COMPLEX_UNIT_PX....

答案 2 :(得分:0)

使用以下方法从DP转换为Pixel:

public static float convertDpToPixel(float dp, Context context){
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float px = dp * ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
    return px;
}

使用以下方法从Pixel转换为DP:

public static float convertPixelsToDp(float px, Context context){
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float dp = px / ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
    return dp;
}