在写代码的时候,因为功能、需求等,需要知道一个控件的宽高,demo如下:
<TextView
android:id="@+id/text_view"
android:layout_width="50dp"
android:layout_height="50dp"/>
Activity中
TextView text_view;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_5);
text_view= (TextView) findViewById(R.id.text_view);
Log.e("onCreate==getMeasuredWidth",text_view.getMeasuredWidth()+"");
Log.e("onCreate==getWidth",text_view.getWidth()+"");
}
@Override
protected void onResume() {
super.onResume();
Log.e("onResume==getMeasuredWidth",text_view.getMeasuredWidth()+"");
Log.e("onResume==getWidth",text_view.getWidth()+"");
}
日志:
E/onCreate==getMeasuredWidth: 0
E/onCreate==getWidth: 0
E/onResume==getMeasuredWidth: 0
E/onResume==getWidth: 0
说明了,在界面上看到布局的时候,还拿不到view的宽高。接下来,(在onCreate中)添加个方法监听
text_view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Log.e("getMeasuredWidth",text_view.getMeasuredWidth()+"");
Log.e("getWidth",text_view.getWidth()+"");
}
});
日志
E/onCreate==getMeasuredWidth: 0
E/onCreate==getWidth: 0
E/onResume==getMeasuredWidth: 0
E/onResume==getWidth: 0
E/getMeasuredWidth: 150
E/getWidth: 150
说明了,绘制(加载)完才能拿到控件的宽高。而在onResume中,控件还没有绘制(加载)。
那么,view是什么时候开始绘制的?
在说明view的绘制之前,我想先说一下,onCreate的流程。算是扩展的知识点吧
在之前的handler源码分析中,我提到了ActivityThread,里面有个handler处理,会处理Activity的各种状态,接下来,去那里的源码看看。这里,我只拿出来onCreate和onResume相关的
public void handleMessage(Message msg) {
if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
switch (msg.what) {
case LAUNCH_ACTIVITY: {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
final ActivityClientRecord r = (ActivityClientRecord) msg.obj;
r