Android:可视屏幕的高度-dp。。。。有效解决方案?

Android:可视屏幕的高度-dp。。。。有效解决方案?,android,size,screen,scrollview,metrics,Android,Size,Screen,Scrollview,Metrics,我看到这个问题被问了100次。。。但我尝试的解决方案都不起作用。。。most在3台设备中的2台设备上工作,而在第三台设备上渲染错误:( 我需要用底部的“按钮区域”(参见ic_启动器图标,例如40dp高度)缩小可视屏幕的大小,以提供我的WebView的大小 (所有这些都是因为我想让它工作,所以我有一个可滚动的网络视图,当我触摸按钮区域时,我可以向上滚动整个屏幕,在按钮区域下方显示一个带有滚动视图的菜单) 我在网上找到了大约10-15个解决方案,有时在模拟器和我的小三星galaxy ace上都能找到

我看到这个问题被问了100次。。。但我尝试的解决方案都不起作用。。。most在3台设备中的2台设备上工作,而在第三台设备上渲染错误:(

我需要用底部的“按钮区域”(参见ic_启动器图标,例如40dp高度)缩小可视屏幕的大小,以提供我的WebView的大小

(所有这些都是因为我想让它工作,所以我有一个可滚动的网络视图,当我触摸按钮区域时,我可以向上滚动整个屏幕,在按钮区域下方显示一个带有滚动视图的菜单)

我在网上找到了大约10-15个解决方案,有时在模拟器和我的小三星galaxy ace上都能找到,但在galaxy S3上,高度又错了。尝试了不同的方法和代码

我的屏幕应该如下所示:

    // STATUSBAR
    int statusbar = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
      if (resourceId > 0) {
           statusbar = getResources().getDimensionPixelSize(resourceId);
      }   
    Toast.makeText(getBaseContext(), "Statusbar= " + String.valueOf(statusbar), Toast.LENGTH_SHORT).show();   

    // GET SCREEN-HEIGHT
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    // HEIGHT IN PIXEL
    float pix_h = metrics.heightPixels;

    // HEIGHT IN DP
    float dp_h = (metrics.heightPixels * 160) / metrics.ydpi;
    Toast.makeText(getBaseContext(), "Height in DP= " + String.valueOf(dp_h), Toast.LENGTH_SHORT).show();

    final float scale = getBaseContext().getResources().getDisplayMetrics().density;
    int pixels = (int) ((dp_h) * scale + 0.5f);
    Toast.makeText(getBaseContext(), "Height in Pixel= " + String.valueOf(pixels), Toast.LENGTH_SHORT).show();

    int height = pixels - statusbar;

实际上,我的代码如下所示:

    // STATUSBAR
    int statusbar = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
      if (resourceId > 0) {
           statusbar = getResources().getDimensionPixelSize(resourceId);
      }   
    Toast.makeText(getBaseContext(), "Statusbar= " + String.valueOf(statusbar), Toast.LENGTH_SHORT).show();   

    // GET SCREEN-HEIGHT
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);

    // HEIGHT IN PIXEL
    float pix_h = metrics.heightPixels;

    // HEIGHT IN DP
    float dp_h = (metrics.heightPixels * 160) / metrics.ydpi;
    Toast.makeText(getBaseContext(), "Height in DP= " + String.valueOf(dp_h), Toast.LENGTH_SHORT).show();

    final float scale = getBaseContext().getResources().getDisplayMetrics().density;
    int pixels = (int) ((dp_h) * scale + 0.5f);
    Toast.makeText(getBaseContext(), "Height in Pixel= " + String.valueOf(pixels), Toast.LENGTH_SHORT).show();

    int height = pixels - statusbar;
谢谢你的帮助

致意
Gerhard

您是否尝试过
getMeasuredWidth();
getMeasuredHeight()
?如果需要在布局之前获取屏幕大小,则必须使用虚拟活动,例如扩展此类的活动:

public class MeasureLayout extends RelativeLayout {

private static int windowH, windowW;

public MeasureLayout(Context context) {
    super(context);
}

public MeasureLayout(Context context, AttributeSet attrs){
    super(context, attrs);
}


protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
{
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    windowW = getMeasuredWidth();
    windowH = getMeasuredHeight();
}

public static int getWidth(){
    return windowW;
}

public static int getHeight(){
    return windowH;
}
}

否则,值将为0


希望这有帮助,Alex

好的,我明天会试试(现在是晚上11点)…第二个问题:我对android/java非常陌生,但我会试试;)。。。在调用此活动之前,我有一些具有不同布局的活动,我是否应该尝试在其中一个活动中测量高度并存储高度?所以在我的onCreate中应该有可用的高度,对吗?这正是我发布的虚拟活动的目的:例如,您将其作为主活动运行,并且您也可以访问其他活动的值,因为它们在MeasureLayout中存储为静态变量。