2011-09-07 42 views
28

Tôi có một thanh tìm kiếm, trong khi di chuyển nó, tôi muốn thay đổi các giá trị từ 0 đến 200. Tôi có một TextView, nơi tôi hiển thị các giá trị đó trong khi di chuyển thanh tìm kiếm. Nhưng tôi không muốn có mọi giá trị từ khoảng thời gian đó (0,1,2,3,4,5 ...), nhưng có 10, 20, 30 ... cứ thế. Vì vậy, khi tôi di chuyển thanh tìm kiếm, tôi muốn hiển thị 10,20,30,40 .... đến 200. Ai đó có thể cho tôi một gợi ý hoặc một ví dụ làm thế nào để làm điều này?Thay đổi giá trị bước trong thanh tìm kiếm?

Trả lời

84

Hãy thử mã dưới đây

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) được sử dụng để thiết lập giá trị bắt đầu của thanh tìm kiếm

setMax(int) được sử dụng để thiết lập giá trị tối đa tìm kiếm thanh

Nếu bạn muốn đặt ranh giới của thanh tìm kiếm, sau đó bạn có thể kiểm tra giá trị thanh tiến trình theo phương pháp onProgressChanged. Nếu tiến trình nhỏ hơn hoặc lớn hơn ranh giới thì bạn có thể đặt tiến trình đến ranh giới bạn đã xác định.

+0

Ồ, đây chỉ là một ví dụ tuyệt vời! Dù sao, tôi có thể đặt giá trị nhỏ nhất của thanh tìm kiếm thành 10 không? Tôi có thể đặt giá trị tối đa, bằng cách nói 'seekBar.setMax (200)', không có giá trị nhỏ nhất.Tôi có một số ý tưởng về cách thực hiện điều này, nhưng mỗi lần bị lỗi ( – lomza

+0

Sử dụng seekBar.setProgress (10); để đặt giá trị nhỏ nhất thành 10 trong thanh tìm kiếm – Dharmendra

+0

Tôi đã giải quyết vấn đề này. 10, tôi vẫn có thể thiết lập 0, và tôi muốn không thể tùy chọn này (vì vậy người dùng không thể chọn một giá trị nhỏ hơn 10) .Tôi đã làm điều này nhưng đặt một câu lệnh if if trong ChangeListener – lomza

3

Bạn nên sử dụng SeekBar.OnSeekBarChangeListener để theo dõi thay đổi tiến độ. Hãy gọi mseek.setMax(200). Thực hiện thao tác modulo trên giá trị hiện tại để quyết định xem textview có nên được cập nhật hay không.

SeekBar.OnSeekBarChangeListener() { 

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

Điều này có thể sẽ bỏ qua các giá trị nếu thanh không phải là rất rộng và/hoặc ngón tay của bạn di chuyển nhanh. –

+0

Đồng ý. Đây là điều đầu tiên tôi nghĩ đến. và đúng không phải là câu trả lời đúng. – Ronnie

+0

Đây là một ví dụ hay, nhưng @Kris Van Bael là đúng, - nó bỏ qua các giá trị. – lomza

15

Cách easieset tôi có thể nghĩ ra, chỉ đơn giản là xác định:

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

Tiếp theo, ghi đè lên các phương pháp đó (các phương pháp có sản phẩm nào cũng được yêu cầu, ngay cả khi họ đang có sản phẩm nào):

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); 
       } 
      } 

     } 
    }); 

Ý tưởng là chỉ xác định 20 giá trị cho thanh tìm kiếm, nhưng luôn nhân giá trị bằng 10 và hiển thị giá trị đó. Nếu bạn không thực sự cần 200 giá trị, thì không có điểm nào khi sử dụng 200 giá trị.

+2

+1 để đơn giản. Tôi đã tìm kiếm một vấn đề khác, kết thúc ở đây, nhưng nghĩ rằng bạn xứng đáng với +1 –

+0

Điều này có vẻ như là giải pháp tốt hơn cho chắc chắn. Tôi thích làm thế nào nó nhảy ngay đến số tiếp theo. Tiến bộ trong khi con số là tĩnh chỉ có vẻ lạ. –

0

cho vấn đề tối thiểu, bạn có thể đặt bù đắp cho tiến độ của mình. Bằng cách này, người dùng không thể đi theo giá trị tối thiểu của bạn.

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

Bạn cũng có thể đạt được điều này bằng cách định nghĩa lớp tùy chỉnh SeekBar như sau

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; 
} 
} 

Và có thể sử dụng bằng cách làm theo cách

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

Trong xml bạn nên thêm CustomSeekBar thay vì SeekBar

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

Vì vậy, bạn có thể tái sử dụng searchBar tùy chỉnh trong toàn bộ ứng dụng với lặp lại toàn bộ phép tính bổ sung.

Các vấn đề liên quan