【问题标题】:setBackgroundResource acts different from setBackground with RippleDrawablesetBackgroundResource 的行为与带有 RippleDrawable 的 setBackground 不同
【发布时间】:2015-09-27 21:58:50
【问题描述】:

我正在尝试将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。

有人知道为什么会这样吗?

【问题讨论】:

    标签: android rippledrawable


    【解决方案1】:

    不要在View 行上设置波纹,而是使用listSelector 属性在ListView 上设置它:

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

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

    【讨论】:

    • 我需要为列表行设置activated 状态,而我设法实现它的方法是直接使用视图的背景而不使用listSelector。使用这种方法,涟漪效果很好,只是我必须尝试找到一种方法来正确设置activated 状态。我仍然觉得奇怪,为什么使用 setBackgroundResource 可以正常工作,但使用 setBackgroundDrawable 却不行。你对此有什么想法吗?
    【解决方案2】:

    致电 View.invalidate();View.requestLayout();

    CompoundButton 函数 setChecked(boolean) 在使用时会使 View 无效,因此要求 View 重新检查自身,然后重新绘制或布局

    【讨论】:

      猜你喜欢
      • 2015-12-24
      • 1970-01-01
      • 2021-06-10
      • 2013-06-26
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 2014-08-27
      • 2015-10-07
      相关资源
      最近更新 更多