2010-06-13 80 views
67

Có ai biết cách xác định giá trị tối thiểu của SeekBar không? Điều này được thực hiện trong bố cục XML hay tôi cần phải xác định nó theo chương trình?Giá trị tối thiểu của Android SeekBar

Về cơ bản tôi cần phải thay đổi giá trị nhỏ nhất của tôi từ 0 đến 0,2

Trả lời

102

Hi, không ai biết làm thế nào để xác định giá trị tối thiểu một SeekBar không?

Bạn không thể xác định giá trị tối thiểu. Đó là 0.

Về cơ bản tôi cần phải thay đổi giá trị tối thiểu của tôi từ 0 đến 0,2

Khi bạn nhận được giá trị, thêm 0.2 với nó.

+0

Bạn cũng nên gọi 'setProgress' để thay đổi được phản ánh trên giao diện người dùng - như Szabolcs Becze thể hiện trong câu trả lời của anh ấy. –

+4

@ user1617737: Không, bạn không nên. Câu trả lời của anh ta không liên quan gì đến giá trị tối thiểu. 'SeekBar' đại diện cho phạm vi từ 0 đến (max-min). Để có được giá trị điều chỉnh, bạn thêm tối thiểu mong muốn của bạn vào tiến độ thực tế. Vì tiến trình thực tế đã được "phản ánh trên giao diện người dùng" nên không có gì thay đổi ở đó. – CommonsWare

+0

OK, điều đó tùy thuộc vào cách thiết lập nhãn của bạn. Tôi vừa cung cấp một câu trả lời hoàn chỉnh mà tôi nghĩ là cách chính xác duy nhất để làm điều đó. http://stackoverflow.com/questions/3033135/android-seekbar-minimum-value/25239248#25239248 –

8

Về cơ bản tôi đã thêm kích thước + 10 sẽ tự động đặt từ min đến 10, bạn có thể thay đổi thiết lập của mình thành phút tối thiểu. giá trị.

@Override 
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    int siz = size + 10; 
    txtViewFontSize.setTextSize(siz); 

    Toast.makeText(this, String.valueOf(siz), Toast.LENGTH_SHORT).show(); 

} 
+0

Về cơ bản tôi đã thêm kích thước + 10 mà sẽ tự động đặt min đến 10 bạn có thể thay đổi của bạn để thiết lập nó min. giá trị . – SALMAN

+10

Vui lòng không sử dụng nhận xét để giải thích mã trong câu trả lời của bạn, vui lòng bao gồm nó như là một phần của câu trả lời. – Flexo

+0

Không có setMin. Tôi muốn đặt mức tối thiểu là -2 ... – powder366

3

Giải pháp của tôi mà làm việc tốt đối với tôi là:

@Override 
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    if (progress <= SOME_LIMIT) { 
     seekBar.setProgress(SOME_LIMIT); 
    } else { 
     // DO SOMETHING 
    } 

} 
12

Đây là những gì tôi sử dụng để có được android:max cho một phạm vi tối đa/phút cho một SeekBar.

mSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
    int progressChanged = minimumValue; 

    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     progressChanged = minimumValue+ progress; 
    } 
}); 

Vì vậy, bạn sẽ nhận được phạm vi minimum to minimum+max;

Để đặt giá trị lớn nhất trong xml, hãy sử dụng max=(desiredMax-min);

+1

Có, tôi nghĩ đây là cách tiếp cận tốt nhất. Một đơn vị của SeekBar chỉ là giá trị trừu tượng. Bạn có thể chỉ cần điều chỉnh chúng trong mã để có được các đơn vị thực tế bạn muốn, vì vậy tôi đã upvoted câu trả lời của bạn. –

5

Giá trị tối thiểu phải là 0 đối với đối tượng SeekBar trong Java (nghĩa là, nó không thể thay đổi), nhưng đây là cách để có được giao diện và hiệu suất được yêu cầu.

Giả sử bạn muốn tối thiểu của bạn là 5 và tối đa của bạn là 100 ...

Vì vậy, bạn có một loạt các 95, vì vậy bạn sẽ cần phải thiết lập các SeekBar với một giá trị tối đa 95.

Nếu thanh tìm kiếm của bạn có nhãn giao diện người dùng, bạn sẽ làm cho chúng 5 (tối thiểu) và 100 (tối đa).

Vì vậy, cách bố trí XML sẽ là một cái gì đó giống như ...

<LinearLayout 
    android:id="@+id/sampleSizeLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/batchDurationSecsLayout" 
    android:orientation="vertical" 
    android:visibility="visible" > 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/sample_size" /> 

    <SeekBar 
     android:id="@+id/sampleSizeSeekBar" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:max="95" /> 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:visibility="visible" > 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:gravity="left" 
      android:text="5" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentTop="true" 
      android:gravity="right" 
      android:text="100" /> 

    </RelativeLayout> 

</LinearLayout> 

Vì vậy tại bạn có thể giới thiệu việc sửa 5, như thế này ...

final SeekBar sampleSizeSeekBar = (SeekBar)findViewById(R.id.sampleSizeSeekBar); 
final int sampleSizeSeekBarCorrection = 5; //e.g., 95 <--> 100 
int realValueFromPersistentStorage = appObj.getSampleSize(); //Get initial value from persistent storage, e.g., 100 
sampleSizeSeekBar.setProgress(realValueFromPersistentStorage - sampleSizeSeekBarCorrection); //E.g., to convert real value of 100 to SeekBar value of 95. 
sampleSizeSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

    int val = sampleSizeSeekBar.getProgress(); 

    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     val = progress + sampleSizeSeekBarCorrection; //e.g., to convert SeekBar value of 95 to real value of 100 
    } 

    public void onStartTrackingTouch(SeekBar seekBar) { 
    } 

    public void onStopTrackingTouch(SeekBar seekBar) { 
     try { 
      appObj.saveSampleSize(val); //Save real value to persistent storage, e.g., 100 
      appObj.makeToast("Sample size set to " + val); 
     } 
     catch(Exception e) { 
      Log.e(LOG_TAG, "Error saving sample size", e); 
      appObj.makeToast("Error saving sample size: " + e); 
     } 
    } 
}); 

Giải pháp này sẽ cung cấp cho thanh tìm kiếm của bạn đúng phút, tối đa và tỷ lệ trên giao diện người dùng và vị trí của điều khiển sẽ không 'nhảy' sang phải nếu người dùng trượt tất cả sang bên trái.

+0

Giải thích hay .. –

2

Bạn không thể đặt tiến trình trong phao vì seekbar.getProgress() luôn trả về giá trị nguyên. Đoạn mã sau sẽ đặt giá trị textview thành 0,2 nếu giá trị thanh tìm kiếm là 0. bạn có thể thay đổi minimumVal theo yêu cầu của bạn.

int minimumVal = 0; 

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 


       if (progress >= minimumVal) { 
        seekBar.setProgress(progress); 
        textView.setText(progress); 
       } else { 
        seekBar.setProgress(minimumVal); 
        textView.setText("0.2"); 
       } 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 
     }); 
1

Bạn có thể thử làm theo cách này:

int yourMinProgress = 10;

private SeekBar.OnSeekBarChangeListener onSeekBarChangeListener = 
    new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean b) { 

      if (progress < yourMinProgress) { 
       seekBar.setProgress(10); 
      } 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 
    }; 
0

mã này hoạt động tốt cho tôi !!!

SeekBar seekBar = (SeekBar)findViewById(R.id.seekBar); 
seekBar.setMax(100); 
seekBar.setProgress(40); 
seekBar.setOnSeekBarChangeListener(seekBarChangeListener); 

SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { 
    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean b) { 
     if(progress <= 40){ 
      seekBar.setProgress(40); 
     } 
     if(progress >= 40) { 
      pgr_status.setText(String.valueOf(progress)); 
     } 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 

    } 
}; 
1

Trong phiên bản api> = 26 bạn có thể bây giờ thêm min xml thuộc tính để SeekBar:

android:min="0.2"

0

cuối cùng tôi đã tìm ra một cách để thiết lập seekBargiá trị tối thiểu, chỉ cần đặt bộ setOnSeekBarChangeListener của bạn như sau:

int minimumValue = 10; // your minimum value 
seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     // you can set progress value on TextView as usual 
     txtProgress.setText(String.valueOf(progress)); 

    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
     if(seekBar.getProgress() < minimumValue) 
      seekBar.setProgress(minimumValue); 

    } 
}); 

Hope this helps :)

0

Như nói João Magalhães:

bây giờ bạn có thể thêm thuộc tính phút xml để SeekBar với:

android:min="0.2" 

Nhưng nó tốt hơn cho API < 26 để sử dụng thuộc tính compat;):

xmlns:app="http://schemas.android.com/apk/res-auto" 
app:min="0.2" 
+0

không có thuộc tính như vậy "app: min". Biên dịch nói không ^^ – GuilhE

0

Dưới đây là làm thế nào tôi đã làm điều này với Kotlin:

view.controlTextSize.setOnClickListener { 

     textSizeControl.textSizeControlSlider.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{ 

      override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { 
       var progress = progress 
       if (progress < 10){ 
        progress = 10 
        seekBar?.progress = progress 
       } 

       view.content.textSize = progress.toFloat() 
       prefs.edit().putFloat("ContentTextSize", progress.toFloat()).apply() 
      } 

      override fun onStartTrackingTouch(seekBar: SeekBar?) {} 

      override fun onStopTrackingTouch(seekBar: SeekBar?) {} 
     }) 
     textSizeControl.show() 
    } 
Các vấn đề liên quan