2015-09-27 2 views
5

Я пытаюсь установить RippleDrawable в качестве фона для строки списка. При использовании view.setBackgroundResource(R.drawable.ripple) все работает нормально. При попыткеsetBackgroundResource действует отличным от setBackground с RippleDrawable

view.setBackground(view.getContext().getDrawable(R.drawable.ripple)) 

это работает, но пульсация не отображается, когда быстро касаясь пункта (я также активированную/проверяется состояние для элемента), она появляется только тогда, когда я держу вид нажатой.

Метод setBackgroundResource в классе View выглядит следующим образом:

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

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

mBackgroundResource = resid; 

поэтому в основном точно, что я пытаюсь сделать вручную.

ПРИМЕЧАНИЕ: Я хочу использовать метод setBackground, потому что я хочу программно создать RippleDrawable.

Есть ли у кого-нибудь идеи, почему это происходит?

ответ

1

Вместо установки пульсации на строке View, установите его на ListView с помощью атрибута listSelector:

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

Программным вы можете установить его с mListView.setSelector(...).

+0

мне нужно имеют «активированное» состояние для строки списка и способ, которым мне удалось это достичь, - использовать фон представления напрямую и не «listSelector». Волна отлично работает с использованием этого подхода, и только я должен попытаться найти способ правильно «активировать» состояние. Мне все еще кажется странным, почему с помощью 'setBackgroundResource' он работает нормально, но с' setBackgroundDrawable' нет. Есть ли у вас какие-либо идеи по этому поводу? – GeorgeP

1

вызов View.invalidate(); вместе с View.requestLayout();

CompoundButton функции setChecked(boolean) при использовании недействительной View поэтому View просят повторно проверить себя, а затем повторно волочения или изложил