Giá trị tối thiểu của Android SeekBar


81

Làm thế nào để xác định giá trị tối thiểu của SeekBar? Điều này được thực hiện trong bố cục XML hay tôi cần xác định nó theo chương trình?

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

Câu trả lời:


122

Làm thế nào để xác định giá trị tối thiểu của SeekBar?

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

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

Khi bạn nhận được giá trị, hãy thêm 0.2vào nó.


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 mình.
ban-geoengineering

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. Các SeekBarđại diện cho khoảng từ 0 đến (max-min). Để nhận được giá trị đã điều chỉnh, bạn thêm số tiền tối thiểu mong muố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

Được rồi, điều đó phụ 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 đầy đủ mà tôi nghĩ là cách chính xác duy nhất để làm điều đó. stackoverflow.com/questions/3033135/…
ban-geoengineering

Đặt nhãn MIN với giá trị nhỏ nhất và đặt nhãn MAX với giá trị lớn nhất. Trong onProgressChanged (), Đặt giá trị hiện tại của bạn Nhãn là tiến trình + minValue.
Rahul Rastogi

22

Đây là những gì tôi sử dụng để lấy android:maxphạm vi tối đa / tối thiểu cho a 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ị tối đa trong xml, hãy sử dụng max=(desiredMax-min);


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

9

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

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

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

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

Vì vậy, bố cục XML sẽ 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, bây giờ bạn có thể giới thiệu sự 5điều chỉnh, 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 giá trị tối thiểu, tối đa và tỷ lệ chính xác 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 hết sang trái.


9

Về cơ bản, tôi đã thêm kích thước + 10 sẽ tự động đặt tối thiểu thành 10, bạn có thể thay đổi kích thước của mình để đặt nó 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();

}

Về cơ bản, tôi đã thêm kích thước + 10 sẽ tự động đặt tối thiểu thành 10, bạn có thể thay đổi kích thước của mình để đặt nó tối thiểu. 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ư một phần của chính câu trả lời.
Flexo

6

Trong các phiên bản api> = 26, bây giờ bạn có thể thêm minthuộc tính xml vào SeekBar:

android:min="0.2"


5

Giải pháp của tôi phù hợp 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
    }

} 

4

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

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 làm việc cho tôi tốt !!!

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) {

    }
};

0

Cuối cùng tôi đã tìm ra cách để đặt seekBar giá trị tối thiểu , chỉ cần đặt setOnSeekBarChangeListenernhư 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);

    }
});

Hi vọng điêu nay co ich :)


0

Đây là cách 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()
    }

0

Nếu bạn đang sử dụng com.android.support:preference-v7, SeekBarPreferenceđã có một phương pháp setMin(int).

Chỉ cần gọi đó trong onCreatePreferences()của bạn PreferenceFragmentCompat.

Các giá trị XML sẽ vẫn bị bỏ qua trên API <26 nhưng việc đặt nó theo chương trình sẽ hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.