2011-09-07 72 views
28

我有一個seekbar,同時移動它我想要將值從0更改爲200.我有一個TextView,在移動seekbar時顯示這些值。但是我不想讓這個區間(0,1,2,3,4,5 ...)的每個值都有,但是要有10,20,30 ......等等。所以,當我移動seekbar,我想顯示10,20,30,40 ....到200.有人可以給我一個提示或例子如何做到這一點?在seekbar中更改步驟值?

回答

84

試試下面的代碼

SeekBar seekBar = (SeekBar)layout.findViewById(R.id.seekbar); 
seekBar.setProgress(0); 
seekBar.incrementProgressBy(10); 
seekBar.setMax(200); 
TextView seekBarValue = (TextView)layout.findViewById(R.id.seekbarvalue); 
seekBarValue.setText(tvRadius.getText().toString().trim()); 

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     progress = progress/10; 
     progress = progress * 10; 
     seekBarValue.setText(String.valueOf(progress)); 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 

    } 
}); 

setProgress(int)用於設置搜索欄

setMax(int)的起始值使用。如果你想設置搜索欄

的最大值設置搜索欄的邊界,然後您可以在onProgressChanged方法中檢查進度條值。如果進度小於或大於邊界,則可以將進度設置爲您定義的邊界。

+0

哇,這只是一個很好的例子!無論如何,我可以將搜索欄的最小值設置爲10嗎?我可以設置最大值,通過說'seekBar.setMax(200)',沒有最小值。我有一些關於如何做到這一點的想法,但每次都會遇到錯誤( – lomza

+0

使用seekBar.setProgress(10);設置最小值爲10在搜索欄 – Dharmendra

+0

我解決了這個問題。 10,我仍然可以設置0,並且我想不能選擇這個選項(所以用戶不能選擇小於10的值)。我這樣做了,但在ChangeListener中加入了'if'語句。 – lomza

3

您應該使用SeekBar.OnSeekBarChangeListener跟蹤進度變化。致電mseek.setMax(200)。對當前值進行模運算以決定是否更新文本視圖。

SeekBar.OnSeekBarChangeListener() { 

    void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     if (progress % 10 == 0) { 
      textview.setText(""+progress); 
     } 
    } 
} 
+2

如果條不是很寬和/或手指移動速度很快,這可能會跳過數值。 –

+0

同意。這是我首先想到的。並沒有正確的答案。 – Ronnie

+0

這是一個很好的例子,但@Kris Van Bael是對的, - 它跳過了值。 – lomza

15

的easieset辦法,我能想到的,是簡單地定義:

SeekBar yourSeekBar = (SeekBar)findViewById(R.id.yourSeekBarId); 
yourSeekbar.setMax(20); 

接下來,覆蓋這些方法(還需要空的方法,即使它們是空的):

yourSeekbar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {   
     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
      if (fromUser) { 
       if (progress >= 0 && progress <= sizeSeekBar.getMax()) {       

        String progressString = String.valueOf(progress * 10); 
        yourTextView.setText(progressString); // the TextView Reference 
        seekBar.setSecondaryProgress(progress); 
       } 
      } 

     } 
    }); 

這個想法是隻爲seekbar定義20個值,但總是將該值乘以10並顯示該值。 如果您確實不需要200個值,那麼使用200個值沒有意義。

+2

+爲簡單起見。我搜索了其他問題,最終在這裏,但認爲你值得+1 –

+0

這似乎是更好的解決方案。我喜歡它如何跳到下一個數字。數字是靜態的進展看起來很奇怪。 –

0

的最低發行,你可以設置你的進度偏移。這樣,用戶就無法達到最低價值。

int offset = 10; 

seekBar seekBar = (SeekBar)layout.findViewById(R.id.seekbar); 
seekBar.setProgress(0); 
seekBar.setMax(190); //with the offset, you need to adapt the max value 
TextView seekBarValue = (TextView)layout.findViewById(R.id.seekbarvalue); 
seekBarValue.setText(""+(seekBar.getProgress() + offset)); 

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){ 

    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     progress += offset; 

     seekBarValue.setText(String.valueOf(progress)); 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 

    } 
}); 
1

您還可以通過定義自定義搜索欄類,如下

public class CustomSeekBar extends AppCompatSeekBar { 


int SEEKBAR_MULTIPLIER = 1; 

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

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

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

public void setSeekBarConfig(int SEEKBAR_MULTIPLIER, int SEEKBAR_MAX){ 
    setMax(SEEKBAR_MAX); 
    this.SEEKBAR_MULTIPLIER = SEEKBAR_MULTIPLIER; 
} 

@Override 
public int getProgress() { 
    return super.getProgress() * SEEKBAR_MULTIPLIER; 
} 
} 

實現這一目標,可以通過以下方式

CustomSeekBar mCustomSeekBar = (CustomSeekBar) findViewById(R.id.customSeekBar); 
mSeekBar.setSeekBarConfig(10,20); 

在XML中使用你應該增加而不是搜索欄

CustomSeekBar
<*.CustomSeekBar 
    com.quemb.qmbform.view:setSeekBarConfig="10" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/seekBar" /> 

因此,您可以在整個應用程序中重複使用自定義seekBar,而無需重複整個額外計算。