Android: requestLayout() appelé improprement
L'erreur suivante se produit lorsque je tente de gonfler une mise en page au sein d'un ListView
:
requestLayout() improperly called by android.widget.TextView{...} during layout: running second layout pass
J'essaie de gonfler une mise en page au sein d'un ListView
comme suit:
@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{...}
}
La mise en page étant gonflé pouvez regarder aussi simple que la suivante, et continuent de produire de l'erreur
<TextView
android:id="@+id/txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/txt_size"/>
J'ai regardé dans des questions similaires, et pas de solutions trouvées semblent fonctionner Question 1, Question 2, Question 3.
Personne ne sait quelles sont les causes de ce type d'erreur? Tous les conseils de dépannage? Pour plus de contexte, ce ListView
est affiché dans une Fragment
dans un ViewPager
Mise à JOUR
Ici, c'est la pleine Mise en page XML (moins un ensemble d'attributs), qui débouche sur le problème
<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>
Sur cette base, je pense que le XML n'est pas un problème, sauf si elle a à voir avec le fait que je suis à l'aide d'un ViewPager et des Fragments
- Quoi d'autre qui se passe dans le
...
à l'intérieur d'abord si le bloc? - Il reprend les points de Vue dans une ViewHolder
- Jetez un oeil à ce. stackoverflow.com/questions/22078961/...
Vous devez vous connecter pour publier un commentaire.
Ce problème qui semble être un bug dans l'android de la mise en œuvre, veuillez consulter: https://code.google.com/p/android/issues/detail?id=75516
L'activation de la fonction de défilement rapide d'un
ListView
dans votre code viaListView.setFastScrollEnabled(true)
va déclencher ce bug et vous allez commencer à voir lamessage dans votre console.
Ce bug doit avoir été introduite dans l'un des KitKat (4.4.x) les mises à jour, comme je ne l'ai pas vu avec la première KitKat (4.4.0) communiqué de presse. En dehors de la laide de la console de spamming avec le message de débogage à partir de ci-dessus, il semble y avoir d'autres impacts (peut-être la performance dans certains cas, que je n'ai pas testé).
Acclamations
PS: ce n'est pas la première fois que la fonction de défilement rapide est buggé, par exemple https://code.google.com/p/android/issues/detail?id=63545, 63545 a été corrigé dans KitKat 4.4.3, mais 75516 poped vers le haut par la suite --> semble être un sujet contrarié pour google 😉
MODIFIER le 12 Mai 2015:
J'ai mis à jour mon Nexus 7 Android 5.1 quelques minutes plus tôt (c'était Running 5.0 avant) et ont cessé de considérer cette question dans cette nouvelle version. Que l'apparition de la FastScroll indicateur a également changé en 5.1, je suppose que google a résolu ce problème ou au moins commenté ces affreux lignes qui spammé la console...
Soixante quinze mille cinq cent seize & Quatre vingt deux mille quatre cent soixante et un sont encore "en suspens", mais je suppose que ceux qui se réfèrent à la même question, qui est maintenant résolu en 5.1.
Le problème est que, bien que la méthode
getView()
de votre adaptateur est de l'affichage de votre mise en page de certains autres code tente d'accéder à ce point de vue à l'écran, ce qui provoque une collision.Noter que certaines méthodes, peut-être que vous ne prenez pas soin de
setScale()
,setTypeFace()
) en effet appelrequestLayout()
, il serait donc intéressant ce que vous faites après gonfler votre déclaration.ImageView
taille dansonSaveInstanceState
, et c'est lorsque cette erreur est apparu et s'est écrasé mon application. Vous ne savez pas comment résoudre, mais cette réponse est plus descriptive que juste "c'est un bug", donc merci pour ça. Donc, pour moi, ce n'était pas un problème de défilement.Pour moi ce problème est survenu sur un
setLayoutParams()
appel. La solution a été de poster un exécutable sur le looper comme indiqué iciimageView.post(new Runnable() { @Override public void run() { imageView.setLayoutParams(params); }});
J'ai résolu ce problème en désactivant fastScroll sur la liste dans le fichier XML.
Cela peut se produire si vous utilisez une 3ème partie de l'extension de la liste. Remplacez la par la norme ListView et vérifier si ça en jette toujours l'erreur.
J'ai eu le même problème. Veuillez vérifier Android mise en page: lancement de la seconde passe de mise en page et ma réponse.
J'ai eu le même problème avec Kitkat 4.4.4 sur le Motorola X avec Genymotion. Dans mon cas, l'élément de la liste est un simple CheckedTextView et l'erreur s'est produite dans AppCompatCheckedTextView.
Comme un fait normal de la mise en œuvre j'ai gonflé le point de XML fichier de mise en page comme ci-dessous:
Après quelques essayant j'ai trouvé que cela a quelque chose à voir avec XML de l'inflation. Je ne sais pas la cause, mais comme une solution, j'ai décidé de gonfler l'élément de la liste par code et de définir toutes les propriétés par le code de trop.
Il a fini comme ça:
Dans mon cas, cet avertissement a empêché un bouton dans les API de 21 appareils. Le bouton de la visibilité était précédemment fixé à DISPARU.
La seule solution je l'ai eu a été mise à l'INVISIBLE, au lieu d'aller pour les API 21. Ce n'était pas une vraie solution, mais c'était acceptable pour moi.
Je ne publier cette raison, il peut être utile de quelqu'un.
Dans mon cas (Samsung Galaxy S4, l'API 21) ce qui s'est passé dans la ListView avec EditTexts. J'ai un écouteur pour la validation de champ. Quelque chose comme:
Après settinging se concentrer dans l'un de ces EditTexts une vérification ci-dessus est appelée. Après qu'un TextView va changer (le TextView contient un message d'erreur et le mensonge, sur la EditText).
La mise au point de la deuxième ou de la troisième EditText led permanents demande de la première EditText et revenir en courant. Une application s'exécute dans une boucle infinie de demandes (focus edittext 1, unfocus edittext 1, 3, unfocus 3, axe 1, etc).
J'ai tenté de listView.setFastScrollEnabled(false). Aussi, j'ai essayé un requestLayout() de certains éléments comme dans https://github.com/sephiroth74/HorizontalVariableListView/issues/93 avec pas de chances.
Actuellement j'ai fait que TextView fixe la largeur et la hauteur en XML:
Après quelques expériences, j'ai remarqué que la hauteur de 20dp peut être remplacé par "wrap_content". Mais si un texte est trop long, qui se divise en 2 lignes, l'application des captures dans la boucle infinie. Donc,
android:singleLine="true"
aidera. C'est déconseillé, mais étonnamment,android:maxLines="1"
avecandroid:lines="1"
n'aident pas qu'ils ont encore de demande de mise en page.Finalement, nous avons:
Ce n'est pas une bonne solution, mais au moins il se casse la boucle infinie.
J'ai eu un problème avec le même avertissement journal :
Je travaillais avec recylcerview et va mettre à jour avec de nouvelles données.
La seule solution qui a fonctionné pour moi est comme ci-dessous :
L'étape(1). Supprimer des données en cours :
L'étape(2). Lorsque vous voulez remplir le recyclerview avec de nouvelles données, définissez d'abord une nouvelle LayoutManager à recyclerview de nouveau:
L'étape(3). Mise à jour le recyclerview avec de nouvelles données. par exemple :
Essayer de décoller le textSize à partir du xml et le mettre dans du code Java. Je pense que c'est à l'origine pour être disposés deux fois.
Parfois, vous avez peut-être déjà résolu le problème, mais il garde toujours la même erreur, de sorte que vous devez fermer visual studio, puis supprimez tous les bin et obj dossiers de vos projets, puis désinstaller l'application à partir de l'émulateur. puis walah!! tout va fonctionne très bien