2015-12-04 2 views
2

Я простирающийся SeekBar:Почему прогресс изменен не называется?

public class NutritionalSeekBar extends SeekBar implements SeekBar.OnSeekBarChangeListener { 

    public NutritionalSeekBar(Context context) { 
     super(context); 
    } 

    public NutritionalSeekBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public NutritionalSeekBar(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public NutritionalSeekBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     progress = (Math.round(progress/50)) * 50; 
     seekBar.setProgress(progress); 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 

    } 
} 

затем использовать его в XML: не

<com.package.views.NutritionalSeekBar 
    android:id="@+id/seek_bar_carbos" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center_vertical" 
    android:progress="50" /> 

Почему прогресс обратного вызова изменился не вызывается?

ответ

2

Если вы хотите, чтобы экземпляр NutritionalSeekBar был его собственным OnSeekBarChangeListener, вы должны установить его как таковой. Вы должны также связать свои конструкторы. Например:

public class NutritionalSeekBar extends SeekBar implements SeekBar.OnSeekBarChangeListener { 

    public NutritionalSeekBar(Context context) { 
     this(context, null); 
    } 

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

    public NutritionalSeekBar(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 

     setOnSeekBarChangeListener(this); 
    } 
    ... 

} 
+0

Хорошо, я понял цепь конструкторов. Как насчет цепочки, только если я на Lollipop для последнего конструктора? – Jumpa

+1

Выполнение этого способа позволяет свести код инициализации к минимуму. Вызов 'this (context, null);' в первом конструкторе вызывает второй конструктор, который в свою очередь вызывает третий. Поскольку первый конструктор не имеет параметра «AttributeSet», мы просто передаем значение по умолчанию второму конструктору. То же самое для вызова третьего конструктора из второго. –

+1

О, я просто понял, что вы реализуете четырехпараметрический конструктор. В этом случае вам также необходимо вызвать код инициализации, поскольку этот конструктор доступен только в Lollipop или выше. Если вы планируете добавлять дополнительные инициализации, а не только слушателя, вы можете переместить их в отдельный метод и вызвать этот метод как из трех, так и четырехпараметрических конструкторов. В противном случае вы можете просто вызвать 'setOnSeekBarChangeListener (this);' снова в four-param. –