Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: requestLayout() improperly called

The following error occurs when I attempt to inflate a layout within a ListView:

requestLayout() improperly called by android.widget.TextView{...} during layout: running second layout pass 

I am attempting to inflate a layout within a ListView as follows:

@Override public View getView(int position, View convertView, ViewGroup parent) {     if(convertView == null){         LayoutInflater inflater = (LayoutInflater) musicActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);         convertView = inflater.inflate(R.layout.list_item, parent, false);         ...     }else{...} } 

The layout being inflated can look as simple as the following, and will still produce the error

<TextView     android:id="@+id/txt"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:textSize="@dimen/txt_size"/> 

I have looked into similar questions, and no solutions found seem to work Question 1, Question 2, Question 3.

Does anyone know what causes this type of error? Any troubleshooting advice? For more context, this ListView is displayed within a Fragment within a ViewPager

UPDATE

Here is the full XML Layout (minus a bunch of attributes), that still results in the problem

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent">   <TextView     android:id="@+id/txt1"     android:layout_width="wrap_content"     android:layout_height="wrap_content" />   <TextView     android:id="@+id/txt2"     android:layout_width="wrap_content"     android:layout_height="wrap_content" />   <TextView     android:id="@+id/txt3"     android:layout_width="wrap_content"     android:layout_height="wrap_content" />  <TextView     android:id="@+id/txt4"     android:layout_width="wrap_content"     android:layout_height="wrap_content"/>  </RelativeLayout> 

Based on this, I would think the XML itself is not a problem, unless it has to do with the fact that I am using a ViewPager and Fragments

like image 218
Daiwik Daarun Avatar asked Jul 06 '14 18:07

Daiwik Daarun


2 Answers

This issue seems to be a bug in the android implementation, please see: https://code.google.com/p/android/issues/detail?id=75516

Activating the fast scroll feature of a ListView in your code via ListView.setFastScrollEnabled(true) will trigger this bug and you'll start seeing the

requestLayout() improperly called by android.widget.TextView{...} during layout: running second layout pass

message in your console.

This bug must have been introduced in one of the KitKat (4.4.x) updates, as I've not seen it with the initial KitKat (4.4.0) release. Apart from the ugly console spamming with the debug message from above, there seem to be no other impacts (maybe performance in some cases, which I haven't tested).

Cheers

PS: it's not the first time that the fast scroll feature is bugged, e.g. https://code.google.com/p/android/issues/detail?id=63545, 63545 was fixed in KitKat 4.4.3 but 75516 poped up thereafter --> seems to be a vexed subject for google ;-)

EDIT May 12 2015:

I updated my Nexus 7 to Android 5.1 some minutes ago (was Running 5.0 before) and stopped seeing this issue in this new version. As the appearance of the FastScroll indicator also changed in 5.1, I assume that google fixed this issue or at least commented out those ugly lines that spammed the console...

75516 & 82461 are still 'unresolved', but I guess that those refer to the same issue, that's now resolved in 5.1.

like image 71
darksaga Avatar answered Sep 28 '22 14:09

darksaga


The problem is that while the method getView() of your adapter is displaying your layout some other code is trying to access this view to display it, resulting in a collision.

Note that some methods, that maybe you don't take care of (like setScale(), setTypeFace()) indeed call requestLayout(), so it would be interesting what you are doing after your inflate statement.

like image 45
axl coder Avatar answered Sep 28 '22 16:09

axl coder