Android 视图组完成充气事件
我已经创建了一个扩展视图组的自定义布局。一切都很好,我得到了预期的布局 我想动态更改布局中的元素。然而,这不起作用,因为我在onCreate中称之为onCreate,直到那时,整个布局实际上并没有(绘制)膨胀到屏幕上,因此没有实际大小 是否有任何事件可用于确定何时完成布局充气?我尝试了onFinishInflate,但这不起作用,因为Viewgroup有多个视图,这将被调用多次Android 视图组完成充气事件,android,android-layout,viewgroup,Android,Android Layout,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。感谢您的帮助!