假设我们有一个Android应用程序想要完全管理显示区域,因此它可以调整其子控件的大小(在运行时,没有XML - 我们需要动态地主动修改子控件大小)。
此应用程序仅以横向方式运行且无键盘输入,因此我们不希望可用区域发生变化。
我们将显示的尺寸将根据此可用区域计算。例如,一个项目恰好占据可用区域的左半部分,右半部分将以严格的比例划分其他项目。甚至会调整字体大小,使它们正确地适合项目。
我最初的想法是为main.xml提供除了没有内容但配置为扩展到最大大小(使用fill_parent
或类似内容)的网格布局。我们将使用网格布局来定位事物,但是我们对大小的控制将决定布局管理器如何显示事物。
希望我们可以在适当的时间(在初始化之后,在绘制之前)查询网格布局以获得分辨率,然后根据它调整所有未来的绘制。
有更好的方法吗?我意识到XML旨在将内容与表示分开,但是这个特定的客户端需要完全控制布局,并且必要时会限制代码可以运行的设备(它是内部应用程序,因此他们可以指示)。 / p>
另一个想法是在XML中添加伪造大小的所有子控件(一切都将在那里,它只是可能改变的大小)。但是,通过这样做,我不确定我是否会失去获得可用区域的能力,从而智能地调整大小。
答案 0 :(得分:3)
您是否在resolution
和density
之间混淆了。什么是“可用的显示分辨率”?每个设备只有一个像素分辨率:
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
final int height = dm.heightPixels;
final int width = dm.widthPixels;
但您显示的内容取决于您受密度和显示尺寸影响的分辨率。
<强>(修订版)强>
(1)以全屏模式开始并隐藏所有标题栏或通知栏:
// Remove title bar
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
// Remove notification bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
(2)获取视图Rect:
Rect rect = new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;
int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight = contentViewTop - statusBarHeight;