我正在尝试在我的应用中找到可用的显示区域,以便我可以通过编程方式调整大小。到目前为止,我有以下内容
@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状态与后退按钮,应用程序按钮,屏幕截图等在同一个栏上,所以没问题。
感谢
答案 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
}