Android 视图组完成充气事件

Android 视图组完成充气事件,android,android-layout,viewgroup,Android,Android Layout,Viewgroup,我已经创建了一个扩展视图组的自定义布局。一切都很好,我得到了预期的布局 我想动态更改布局中的元素。然而,这不起作用,因为我在onCreate中称之为onCreate,直到那时,整个布局实际上并没有(绘制)膨胀到屏幕上,因此没有实际大小 是否有任何事件可用于确定何时完成布局充气?我尝试了onFinishInflate,但这不起作用,因为Viewgroup有多个视图,这将被调用多次 我正在考虑在自定义布局类中创建一个接口,但不确定何时启动它?通常在创建自定义布局扩展视图或视图组时,必须在测量时覆盖受

我已经创建了一个扩展视图组的自定义布局。一切都很好,我得到了预期的布局

我想动态更改布局中的元素。然而,这不起作用,因为我在onCreate中称之为onCreate,直到那时,整个布局实际上并没有(绘制)膨胀到屏幕上,因此没有实际大小

是否有任何事件可用于确定何时完成布局充气?我尝试了onFinishInflate,但这不起作用,因为Viewgroup有多个视图,这将被调用多次


我正在考虑在自定义布局类中创建一个接口,但不确定何时启动它?

通常在创建自定义布局扩展
视图或
视图组
时,必须在测量时覆盖
受保护的空区(int-widthMeasureSpec,int-heightMeasureSpec)
受保护的空区Only布局(布尔值已更改、int left、int top、int right、int bottom)
。在充气过程中调用这些参数,以获取与视图相关的大小和位置信息。此外,如果要扩展
视图组
,则需要调用
度量(int widthMeasureSpec,int heightMeasureSpec)
布局(int l,int t,int r,int b)
中包含的每个子视图。(在onMeasure()中调用measure(),在onLayout()中调用layout()

无论如何,在
onMeasure()
中,您通常会这样做

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
   // Gather this view's specs that were passed to it
   int widthMode = MeasureSpec.getMode(widthMeasureSpec);
   int widthSize = MeasureSpec.getSize(widthMeasureSpec);
   int heightMode = MeasureSpec.getMode(heightMeasureSpec);
   int heightSize = MeasureSpec.getSize(heightMeasureSpec);

   int chosenWidth = DEFAULT_WIDTH;
   int chosenHeight = DEFAULT_HEIGHT;
   if(widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.EXACTLY)
      chosenWidth = widthSize;
   if(heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.EXACTLY)
      chosenHeight = heightSize;

   setMeasuredDimension(chosenWidth, chosenHeight);

   *** NOW YOU KNOW THE DIMENSIONS OF THE LAYOUT ***
}
onLayout()
中,您可以获得视图的实际像素坐标,因此可以获得如下物理尺寸:

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom)
{
   // Android coordinate system starts from the top-left
   int width = right - left;
   int height = bottom - top;
}

如果我正确理解您的需求,OnGlobalYoutListener可能会提供您所需的

  View myView=findViewById(R.id.myView);
  myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //At this point the layout is complete and the 
                //dimensions of myView and any child views are known.
            }
        });

感谢您的回复。我已经完成了您规定的所有操作。我的查询是因为值将是动态的,我如何从活动中传递数据,更重要的是何时(事件)传递数据?好的。我以为您在视图中动态更改了视图。如果是这样,您可以使用这两种方法来查找坐标(甚至在视图出现之前)。另一个选项可能是使用
onWindowFocusChanged()
这是
活动的一部分
。根据当前活动窗口获得或失去焦点时调用的文档
。这是该活动是否对用户可见的最佳指示器。默认实现清除密钥跟踪状态,因此应始终调用。
我使用它来确定ne当一个窗口在视图中时(因此膨胀)。+1,感谢您的响应。上面的方法不是可靠的方法,尽管在某些情况下可能会起作用。我已经使用此方法在textview中调整textsize一段时间了,但从未知道此方法也可以用于ViewGroup。感谢您的帮助!