2328 private void performLayout(WindowManager.LayoutParams lp, int desiredWindowWidth,
2329 int desiredWindowHeight) {2330 mLayoutRequested = false;
2331 mScrollMayChange = true;
2332 mInLayout = true;
2333
2334 final View host = mView;
2335 if (DEBUG_ORIENTATION || DEBUG_LAYOUT) {
2336 Log.v(mTag, "Laying out " + host + " to (" +
2337 host.getMeasuredWidth() + ", " + host.getMeasuredHeight() + ")");
2338 }
2339
2340 Trace.traceBegin(Trace.TRACE_TAG_VIEW, "layout");
2341 try {
2342 host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight());
2343
2344 mInLayout = false;
2345 int numViewsRequestingLayout = mLayoutRequesters.size();
2346 if (numViewsRequestingLayout > 0) {
2347 // requestLayout() was called during layout.
2348 // If no layout-request flags are set on the requesting views, there is no problem.
2349 // If some requests are still pending, then we need to clear those flags and do
2350 // a full request/measure/layout pass to handle this situation.
2351 ArrayList<View> validLayoutRequesters = getValidLayoutRequesters(mLayoutRequesters,
2352 false);
2353 if (validLayoutRequesters != null) {
2354 // Set this flag to indicate that any further requests are happening during
2355 // the second pass, which may result in posting those requests to the next
2356 // frame instead
2357 mHandlingLayoutInLayoutRequest = true;
2358
2359 // Process fresh layout requests, then measure and layout
2360 int numValidRequests = validLayoutRequesters.size();
2361 for (int i = 0; i < numValidRequests; ++i) {
2362 final View view = validLayoutRequesters.get(i);
2363 Log.w("View", "requestLayout() improperly called by " + view +
2364 " during layout: running second layout pass");
2365 view.requestLayout();
2366 }
2367 measureHierarchy(host, lp, mView.getContext().getResources(),
2368 desiredWindowWidth, desiredWindowHeight);
2369 mInLayout = true;
2370 host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight());
2371
2372 mHandlingLayoutInLayoutRequest = false;
2373
2374 // Check the valid requests again, this time without checking/clearing the
2375 // layout flags, since requests happening during the second pass get noop'd
2376 validLayoutRequesters = getValidLayoutRequesters(mLayoutRequesters, true);
2377 if (validLayoutRequesters != null) {
2378 final ArrayList<View> finalRequesters = validLayoutRequesters;
2379 // Post second-pass requests to the next frame
2380 getRunQueue().post(new Runnable() {
2381 @Override
2382 public void run() {
2383 int numValidRequests = finalRequesters.size();
2384 for (int i = 0; i < numValidRequests; ++i) {