某些设备上选择了完全错误的资源

时间:2013-09-27 11:47:27

标签: android listview

我的Android应用程序中的资源有一个奇怪的问题。我有一个ListView,我根据项目的状态设置元素的背景。我在getView - 我的适配器的方法(tvTextView)中执行此操作:

if (position == currentSelection - 1) {
    tv.setBackgroundResource(R.drawable.list_selector_background_pressed);
    tv.setTextColor(getContext().getResources().getColor(R.color.my_white));
}
else {
    tv.setBackgroundResource(R.drawable.list_selector_background);
    tv.setTextColor(getContext().getResources().getColor(R.color.text_color));
}

list_selector_background包含不同的项目,具体取决于状态(按下,聚焦,禁用等)。默认状态为@color/transparentlist_selector_background_pressed是一个9-patch-image,在list_selector_background中也用作压缩状态。

在我的Android 4.3模拟器上,一切正常。我的4.3设备上也一样。在我的2.2设备(支持的最低API版本)而不是list_selector_background drawable上,显示了drawable-hdpi中的不同图像。 if部分工作正常。问题恰好出现在代码的else部分。

我知道库项目的问题和讨论的冲突ID,例如here。我的问题很相似,但在一些细节上有所不同。 始终为我的ListView选择了错误的背景,并且它始终是相同的背景。有时,当我首先打开不同的活动时,它会有所帮助有时却没有。清洁无效。完全卸载并再次安装无法正常工作

任何提示都将受到高度赞赏。

修改

我的getView方法的完整源代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;

    if (v == null) {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        v = inflater.inflate(resource, null);
    }

    TextView tv = (TextView) v.findViewById(android.R.id.text1);
    tv.setText(getItem(position));

    if (position == currentSelection - 1) {
        tv.setBackgroundResource(R.drawable.list_selector_background_pressed);
        tv.setTextColor(getContext().getResources().getColor(R.color.my_white));
    }
    else {
        tv.setBackgroundResource(R.drawable.list_selector_background);
        tv.setTextColor(getContext().getResources().getColor(R.color.text_color));
    }

    return v;
}

currentSelection是一个整数,由某个时间的视图设置。然后该项目应该看起来突出显示,这在模拟器上工作正常。它显示drawable-hdpi文件夹的图像icon_toolbox。它不是list_selector_background drawable的一部分,它看起来像这样:

<item android:state_window_focused="false"
    android:drawable="@color/transparent" />

<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false"
    android:state_pressed="true"
    android:drawable="@drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_enabled="false"
    android:drawable="@drawable/list_selector_background_disabled" />

<item android:state_focused="true" android:state_pressed="true"
    android:drawable="@drawable/list_selector_background_transition" />
<item android:state_focused="false" android:state_pressed="true"
    android:drawable="@drawable/list_selector_background_transition" />

<item android:state_focused="true"
    android:drawable="@drawable/list_selector_background_focus" />

<item android:drawable="@color/transparent" />

1 个答案:

答案 0 :(得分:0)

在评论部分之后:

我认为你有干扰方法,它们都影响TextView - 你正在谈论的那个onClick,第二个是状态选择器,来自上面的代码。 据我所知,android.R.layout.simple_list_item_1是默认值,因此当android.R%文件出现问题时,所有R.java内容都会被替换,这就是为什么它是我怀疑(如果它符合你的需要,那么好)。

但是,如果您为XML定义TextView(手动),则会在R.java中定义,而不是在android.R中定义...