LayoutInflater 有时(随机)以错误的背景颜色膨胀

Posted

技术标签:

【中文标题】LayoutInflater 有时(随机)以错误的背景颜色膨胀【英文标题】:LayoutInflater sometimes (randomly) inflates with wrong background color 【发布时间】:2013-08-10 04:30:43 【问题描述】:

我使用 LayoutInflater 为视图充气。我膨胀的 RelativeLayout 的背景颜色在我的 xml 文件中设置。我在我的一个设备上遇到了一个奇怪的问题:有时(随机)背景颜色是我的 colors.xml 中的另一种(错误)颜色。有没有人遇到过这个问题?

详情:

我有一个ListView 和一个CursorAdapter。我只用一个静态项目来膨胀列表项目(所以我认为这不是回收问题),使用以下代码:

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) 
    LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
    View v = vi.inflate(R.layout.bookmark_item, null) ;
    //bindView(v, context, cursor) ;
    Log.wtf("newView", "View color: " + Integer.toString(((ColorDrawable) (((RelativeLayout)v.findViewById(R.id.bookmark_row)).getBackground())).getColor())) ;
    return v;

我的layout/bookmark_item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_ >

    <RelativeLayout
        android:id="@+id/bookmark_row"
        android:layout_
        android:layout_
        android:background="@color/app_menu_item_background"
        tools:ignore="UselessParent" >

        <TextView 
            android:id="@+id/bookmark_item_title"
            android:layout_
            android:layout_
        />
    </RelativeLayout>

</RelativeLayout>

内部RelativeLayout 的背景颜色设置为@color/app_menu_item_background。这个颜色在我的R.java

public static final int app_menu_item_background=0x7f0a0036; 

我还有一个名为@color/app_menu_item_colored_background 的颜色,我在代码的其他地方使用它,它与我的书签列表和适配器没有任何共同之处。它在R.java 中也有不同的资源ID:

public static final int app_menu_item_colored_background=0x7f0a0038;

而且它们都是不同的颜色:

<color name="app_menu_item_background">#517409</color>
<color name="app_menu_item_colored_background">#f6efde</color>

然后,在运行我的应用程序时,有时(并非总是)我的视图使用了错误的app_menu_item_colored_background 背景颜色。我记录了膨胀的视图颜色(参见上面的代码),有时甚至会有所不同:

"newView" - "View color: -11439095"
"newView" - "View color: -593954"

注意,第一种颜色是#517409,第二种是#f6efde

奇怪的是,我只能在一台设备上重现该错误,三星 Galaxy S3 mini,每 10 次尝试大约 2-3 次。

【问题讨论】:

我遇到了同样的问题,所以我做了手动设置颜色的肮脏解决方案,但经过仔细分析后,我认为这是一个内存泄漏/管理不善的问题,会影响布局。这很奇怪!它也可能与RelativeLayouts 有关。如果找到原因/解决方案,请发布。 ***.com/a/16447561/1703129 这看起来像是一个解决方案! 您正在尝试使用 Integer.tostring() 将十六进制值打印为字符串,因此它将始终返回类似的内容 尝试删除tools:ignore="UselessParent" @Arju 03:53:是的,我知道这就是为什么它会这样打印(我在下一句中提到过)——但这不是问题的原因。 【参考方案1】:

手动尝试

v.setBackgroundColor(getResources().getColor(R.color.app_menu_item_colored_background));

【讨论】:

正如我在将近 2 年前的 cmets 中指出的那样,我使用这种解决方法来解决问题,但它没有解释为什么会出现这个非常奇怪的问题。【参考方案2】:

我为运行 4.1 的 S2 的主题的 windowBackground 设置了这个。如this answer 中所述,我使用固态可绘制对象代替颜色作为解决方法。我有一种预感,这也适用于视图背景。

我不知道这种行为的原因。

【讨论】:

【参考方案3】:

我以前听说过。 在您设置背景的适配器中,如果您没有设置背景,则会发生这种情况。所以你应该在每个调用的 getView 中设置你的背景。如果你没有设置这个背景并且你想保存它的状态,那么设置为 null 那个视图。

【讨论】:

以上是关于LayoutInflater 有时(随机)以错误的背景颜色膨胀的主要内容,如果未能解决你的问题,请参考以下文章

iOS应用程序崩溃没有错误,只是(lldb)

at android.view.LayoutInflater.createViewFromTag的错误原因

获取随机“facebookErrDomain 错误 10000”

PHP-cgi 随机停止工作而没有错误日志

随机 SSIS 错误代码 DTS_E_PRIMEOUTPUTFAILED

iOS Push Segue(以编程方式)有时会卡住但不会崩溃