2015-12-04 57 views
2

我擴大搜索欄:爲什麼改變的過程不叫?

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

好的,我瞭解了構造函數鏈。只有當我在最後一個構造函數的棒棒糖上時,鏈接怎麼樣? – Jumpa

+1

這樣做可以讓您將初始化代碼降到最低。在第一個構造函數中調用this(context,null);調用第二個構造函數,然後調用第三個構造函數。由於第一個構造函數沒有'AttributeSet'參數,因此我們只將默認值傳遞給第二個構造函數。從第二個調用第三個構造函數也是一樣。 –

+1

哦,我剛剛意識到你也在實現四參數構造函數。在這種情況下,您還需要在那裏調用您的初始化代碼,因爲該構造函數僅在Lollipop或更高版本中可用。如果您計劃添加更多的初始化而不僅僅是偵聽器,則可以將它們移動到單獨的方法,並從三參數和四參數構造函數中調用該方法。否則,你可以在四參數中再次調用'setOnSeekBarChangeListener(this);'。 –