setBackgroundResource与带有RippleDrawable的setBackground的行为不同。

5
我将尝试为列表视图的行设置一个RippleDrawable背景。使用view.setBackgroundResource(R.drawable.ripple)一切正常。当尝试使用
view.setBackground(view.getContext().getDrawable(R.drawable.ripple))

当快速点击该项时(我还为该项设置了已激活/选中状态),它可以工作,但涟漪效果不会显示出来,只有在我长按视图时才会出现。

View类中的setBackgroundResource方法如下:

if (resid != 0 && resid == mBackgroundResource) {
    return;
}

Drawable d = null;
if (resid != 0) {
    d = mContext.getDrawable(resid);
}
setBackground(d);

mBackgroundResource = resid;

基本上,我正在尝试手动完成的确切操作。

注意:我想使用setBackground方法,因为我想以编程方式创建RippleDrawable。

有人知道为什么会发生这种情况吗?

2个回答

1

不要在行View上设置涟漪,而应该使用listSelector属性在ListView上设置涟漪:

<ListView
    ...
    android:listSelector="@drawable/ripple" />

您可以通过编程方式使用mListView.setSelector(...)来设置它。

我需要为列表行设置一个“已激活”状态,我使用视图的背景而不是listSelector来实现它。这种方法可以正常工作,只是我必须尝试找到一种正确设置“已激活”状态的方法。我仍然觉得奇怪的是,为什么使用setBackgroundResource可以正常工作,但使用setBackgroundDrawable却不行。你有任何想法吗? - GeorgeP

1
调用 View.invalidate(); 以及 View.requestLayout();,与 CompoundButton 函数 setChecked(boolean) 一起使用时,会使 View 无效,因此要求 View 自我重新检查并重新绘制或布局。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接