3

首先,我多年来一直在阅读这个网站,它多次帮助我摆脱困境,所以感谢这里贡献的社区,希望你能帮助我解决我自己的问题。

我刚开始在我的公司进行 Android 开发,我正在尝试将现有应用程序从 Windows Mobile C# 移植到 Android Java。其中大部分进展顺利,但我遇到一些困难的一个领域是用户界面。

Windows Mobile 应用程序在创建 WinForm 时从文件中读取调查规范。在封闭式问题(例如多项选择)的情况下,我需要使用 CheckBox 或 RadioButton 控件为规范中的每个适用答案填充屏幕。创建所需的布局和控件是没有问题的,但我们还有一个要求是屏幕不滚动。因此,我们的软件需要能够在显示之前计算可用屏幕空间内的最佳拟合而不会溢出(即用于显示的 1-4 列)

我已经将我的 UI(至少是布局)编写为 XML 资源或 Java 代码,但是因为像 GetWidth() 和 GetHeight() 这样的方法在 onCreate() 中返回 0,所以我还不能添加这个必需的 pre -加工。

所有这些都需要在屏幕显示之前发生。如果有人能指出我正确的方向,我将不胜感激。

4

1 回答 1

1

当 Android 从布局构建 UI 时,布局的根会通过调用 onMeasure() 请求其所有子级报告所需的大小。它这样做是一种自下而上的递归方式。如有必要,父视图将设置子视图的大小以使其适合。正如您所发现的,此测量过程在 onCreate() 期间并未完成。

尝试一个全局布局监听器。

public void onCreate(Bundle savedInstanceState)
{
     super.onCreate(savedInstanceState);

     // inflate your main layout here (use RelativeLayout or whatever your root ViewGroup type is
     LinearLayout mainLayout = (LinearLayout ) this.getLayoutInflater().inflate(R.layout.main, null); 

     // set a global layout listener which will be called when the layout pass is completed and the view is drawn
     mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
     new ViewTreeObserver.OnGlobalLayoutListener() {
          public void onGlobalLayout() {
               // measure your views here
          }
     }
 );

 setContentView(mainLayout);
于 2012-11-06T14:33:50.500 回答