Android:requestLayout()调用不当

Dai*_*run 42 performance android android-listview

当我尝试在以下内容中扩充布局时发生以下错误ListView:

requestLayout() improperly called by android.widget.TextView{...} during layout: running second layout pass
Run Code Online (Sandbox Code Playgroud)

我试图在一个内部膨胀布局ListView如下:

@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{...}
}
Run Code Online (Sandbox Code Playgroud)

膨胀的布局可以看起来像下面这样简单,并且仍然会产生错误

<TextView
    android:id="@+id/txt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="@dimen/txt_size"/>
Run Code Online (Sandbox Code Playgroud)

我已经研究了类似的问题,找不到任何解决方案似乎工作问题1,问题2,问题3.

有谁知道导致此类错误的原因是什么?任何疑难解答建议 对于更多上下文,它ListView显示在a FragmentViewPager

UPDATE

这是完整的XML布局(减去一堆属性),仍然会导致问题

<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>
Run Code Online (Sandbox Code Playgroud)

基于此,我认为XML本身不是问题,除非它与我使用ViewPager和Fragments这一事实有关

dar*_*aga 41

这个问题似乎是Android实现中的一个错误,请参阅:https://code.google.com/p/android/issues/detail?id = 75516

激活ListView代码中a的快速滚动功能ListView.setFastScrollEnabled(true) 将触发此错误,您将开始看到

requestLayout()在布局期间由android.widget.TextView {...}不正确地调用:运行第二个布局传递

控制台中的消息.

这个bug必须在其中一个KitKat(4.4.x)更新中引入,因为我没有在最初的KitKat(4.4.0)版本中看到它.除了丑陋的控制台垃圾邮件与上面的调试消息,似乎没有其他影响(在某些情况下可能性能,我还没有测试).

干杯

PS:这不是第一次快速滚动功能被窃听,例如https://code.google.com/p/android/issues/detail?id=63545,63545已在KitKat 4.4.3中修复但75516加速了此后 - >似乎是谷歌的烦恼主题;-)

编辑2015年5月12日:

几分钟前我将Nexus 7更新为Android 5.1(之前运行的是5.0)并且在这个新版本中停止了这个问题.由于FastScroll指标的外观在5.1中也发生了变化,我认为google修复了这个问题,或者至少注释掉了那些垃圾邮件控制台的丑陋线条......

7551682461仍然"尚未解决",但我猜这些问题引用了同样的问题,现在已经在5.1中解决了.


axl*_*der 18

问题是,当getView()您的适配器的方法显示您的布局时,其他一些代码正试图访问此视图以显示它,从而导致冲突.

请注意,某些方法,也许你没有照顾(比如setScale(),setTypeFace())确实调用requestLayout(),所以在你的膨胀声明后你正在做的事情会很有趣.


小智 7

对我来说,这个问题是在setLayoutParams()打电话时发生的。该解决方案是张贴在尺蠖一个可运行的说明这里

  • 我可能遇到了同样的问题,但是该链接已断开。**编辑:**使用以下命令解决:`imageView.post(new Runnable(){@Override public void run(){imageView.setLayoutParams(params);}});` (2认同)

Joa*_*huk 5

我通过在XML中禁用ListView上的fastScroll来修复此问题.

<ListView
    android:id="@+id/mListview"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"

    android:fastScrollEnabled="false"
/>
Run Code Online (Sandbox Code Playgroud)

  • 如果你想使用快速滚动,我不认为这是一个解决方案. (2认同)

Gab*_*han 0

尝试从 xml 中取出 textSize 并在 Java 代码中设置它。我认为这导致它被布置两次。