1

假设我们有一个想要完全管理显示区域的 Android 应用程序,因此它可以调整其子控件的大小(在运行时,没有 XML - 我们需要动态地主动修改子控件的大小)。

此应用程序将仅以横向运行,没有键盘输入,因此我们不希望可用区域发生变化。

我们将显示的大小将根据此可用区域计算。例如,一个项目恰好占据可用区域的左半部分,右半部分将与其他项目严格按比例分配。甚至字体大小也会被调整,以便它们正确地适合项目。

我最初的想法是只为 main.xml 提供一个没有内容但配置为扩展到最大大小(具有fill_parent或类似的东西)的网格布局。我们将使用网格布局来定位事物,但是我们对大小施加的控制将决定布局管理器如何显示事物。

希望我们可以在适当的时间(在初始化之后,绘制之前)查询网格布局以获得分辨率,然后基于此调整所有未来的绘制。

有一个更好的方法吗?我意识到 XML 旨在将内容与演示分开,但这个特定的客户希望完全控制布局,并在必要时限制可以运行代码的设备(它是一个内部应用程序,因此他们可以指定)。

我的另一个想法是在 XML 中添加具有虚假大小的所有子控件(一切都将永远存在,只是大小可能会改变)。但是,通过这样做,我不确定我是否会失去获得可用区域并因此智能调整大小的能力。

4

1 回答 1

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 = 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;
于 2012-09-07T03:58:55.820 回答