Android如何找到可用的显示区域

时间:2014-06-30 06:22:05

标签: android

我正在尝试在我的应用中找到可用的显示区域,以便我可以通过编程方式调整大小。到目前为止,我有以下内容

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);

        Display display = getWindowManager().getDefaultDisplay();
        DisplayMetrics metrics = new DisplayMetrics();
        display.getMetrics(metrics);
        Point size = new Point();
        display.getSize(size);


        final TypedArray styledAttributes = getBaseContext().getTheme().obtainStyledAttributes(
                new int[] { android.R.attr.actionBarSize });
        int actionBarHeight = (int) styledAttributes.getDimension(0, 0);
        styledAttributes.recycle();

        int usableHeight = size.y - actionBarHeight;

在大多数情况下有效,但我有一个平板电脑设置在顶部(32像素高)菜单栏,其中包含时间,网络状态,电池电量等(不知道是否有真实它的名称)和底部的条形图(高48像素),它有后退按钮,应用程序键和屏幕截图按钮。

我的设备是800x600所以当我做display.getSize(size);我得到552 = 600 - 底部条48像素。问题是,它不会减去顶部栏。

那么如何访问顶部栏(如果存在)以便找到真正的应用区域?

我有另一款平板电脑,时间,电池电量和wifi状态与后退按钮,应用程序按钮,屏幕截图等在同一个栏上,所以没问题。

感谢

1 个答案:

答案 0 :(得分:0)

要获得适合您应用的屏幕区域,您需要进行衡量 您自己的应用的父视图:

   final View view = getWindow().getDecorView().getRootView();

   int scrLoc[] = new int[2];
   top.getLocationOnScreen(scrLoc);
   int BottomLoc[] = new int[2];
   bottom.getLocationOnScreen(BottomLoc);
   boolean portrait = getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE;
   if (portrait) {
      availableWidth = top.getWidth();
      availableHeight = BottomLoc[1] - scrLoc[1];
   } else {
      availableWidth = top.getWidth();
      availableHeight = BottomLoc[1] - scrLoc[1];
   }

而且,如果你需要在onResume之前进行测量(比如在onCreate上),你会 需要将此代码包装在ViewTreeObserver回调

最后 - 如果您的应用是屏幕尺寸敏感的,您可能还想更改它 切换屏幕方向时的内部状态。要做到这一点

清单中的

<activity android:name=".MainActivity"
    android:label="@string/app_name"
    android:configChanges="orientation">

并在活动中:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.main);      
    // your change orientation logic here
}