2013-09-21 3 views
1

У меня проблема с очень простым пользовательским представлением. Его целью является только рисование простой вертикальной пунктирной линии. Я хотел бы изменить цвет линии в соответствии с нажатым состоянием своего родительского контейнера. У меня есть этот код:Нажатое состояние не заполнено для меня.

public class DottedLine extends View { 

    float density ; 
    float size; 
    Paint paint; 

    public DottedLine(Context context) { 
     this(context, null, 0); 
    } 

    public DottedLine(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public DottedLine(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     DisplayMetrics metrics = getContext().getResources().getDisplayMetrics(); 
     density = metrics.density; 
     size = 2 * density; //2dp 
     paint = new Paint(); 
     paint.setStyle(Paint.Style.FILL_AND_STROKE); 
     paint.setStrokeWidth(size); 
     paint.setColor(getResources().getColor(R.color.main_kosapp)); 
     paint.setPathEffect(new DashPathEffect(new float[] {size, size}, 0)); 

    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     float diff = canvas.getHeight()%size; 

     Path path = new Path(); 
     path.moveTo(canvas.getWidth()/2, diff/2); 
     path.lineTo(canvas.getWidth()/2,canvas.getHeight()-diff/2); 

     if(this.isPressed() || this.isFocused()) { 
      paint.setColor(getResources().getColor(R.color.light_gray)); 
     } else { 
      paint.setColor(getResources().getColor(R.color.main_kosapp)); 
     } 
     canvas.drawPath(path, paint); 
    } 
} 

Проблема заключается в том, что метод onDraw получает не вызывается после того, как я нажимаю точку зрения. Я попытался установить duplicateParentState в true, но это совсем не помогло. FYI в моем макете у этого представления есть два прямых брата - textviews - оба имеют свой цвет текста, определенный с помощью селекторов, и он работает для этих текстовых просмотров. Что не так с моей реализацией представления? Что мне нужно добавить в класс, чтобы заставить селекторов работать?

+0

попробуйте добавить 'андроид: кликабельны =«истинный»' в xml для вашего пользовательского 'View'. –

+0

попробуйте добавить android: duplicateParentState = "true" в вашем макете для вашего пользовательского представления –

ответ

0

вы должны аннулировать Ваше мнение для прессованного состояния путем переопределения dispatchSetPressed

@Override 
protected void dispatchSetPressed(boolean pressed) { 
    super.dispatchSetPressed(pressed); 
    invalidate(); 
} 

по крайней мере, работал для меня без использования событий движения

Смежные вопросы