Minimalna wartość paska wyszukiwania w systemie Android

81

Jak zdefiniować minimalną wartość SeekBar? Czy jest to zrobione w układzie XML, czy też muszę zdefiniować to programowo?

Zasadniczo muszę zmienić moją minimalną wartość z 0 na 0,2

Sachin
źródło

Odpowiedzi:

122

Jak zdefiniować minimalną wartość SeekBar?

Nie możesz zdefiniować wartości minimalnej. Tak jest 0.

Zasadniczo muszę zmienić moją minimalną wartość z 0 na 0,2

Kiedy uzyskasz wartość, dodaj 0.2do niej.

CommonsWare
źródło
Powinieneś także zadzwonić, setProgressaby zmiana została odzwierciedlona w interfejsie użytkownika - jak pokazuje Szabolcs Becze w swojej odpowiedzi.
zakaz geoinżynierii
4
@ user1617737: Nie, nie powinieneś. Jego odpowiedź nie ma nic wspólnego z wartością minimalną. SeekBarOznacza zakres od 0 do (max-min). Aby uzyskać dostosowaną wartość, dodaj żądane minimum do rzeczywistego postępu. Ponieważ rzeczywisty postęp jest już „odzwierciedlony w interfejsie użytkownika”, nie ma tam nic do zmiany.
CommonsWare,
OK, to zależy od konfiguracji etykiet. Właśnie udzieliłem pełnej odpowiedzi, która moim zdaniem jest jedynym właściwym sposobem, aby to zrobić. stackoverflow.com/questions/3033135/…
ban-geoengineering
Ustaw etykietę MIN z wartością minimalną i ustaw etykietę MAX z wartością maksymalną. W onProgressChanged () ustaw bieżącą wartość Label jako progress + minValue.
Rahul Rastogi
22

Oto, czego używam, aby uzyskać android:maxmaksymalny / minimalny zakres dla a SeekBar.

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

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

Więc otrzymasz zakres minimum to minimum+max;

Aby ustawić maksymalną wartość w xml, użyj max=(desiredMax-min);

Asthme
źródło
2
Tak, myślę, że to najlepsze podejście. Jednostki SeekBar to tylko abstrakcyjne wartości. Możesz po prostu dostosować je w kodzie, aby uzyskać żądane jednostki, więc zagłosowałem za twoją odpowiedzią.
David George
9

Wartość minimalna musi wynosić 0 dla obiektu SeekBar w Javie (tj. Nie można jej zmienić), ale w ten sposób można uzyskać wymagany wygląd i wydajność.

Załóżmy, że chcesz, aby Twoja min. Wynosiła 5, a maksymalna 100 ...

Dlatego masz zakres 95, więc musisz ustawić SeekBar z maksymalną wartością 95.

Jeśli twój pasek wyszukiwania ma etykiety UI, możesz je ustawić 5(min) i 100(max).

Więc układ XML wyglądałby mniej więcej tak ...

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

Więc teraz możesz wprowadzić 5poprawkę, taką jak ta ...

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

To rozwiązanie zapewni paskowi wyszukiwania prawidłowe wartości min, max i skalę w interfejsie użytkownika, a pozycja kontrolki nie przeskoczy w prawo, jeśli użytkownik przesunie ją do końca w lewo.

zakaz geoinżynierii
źródło
9

Zasadniczo dodałem rozmiar + 10, który automatycznie ustawi min na 10, możesz zmienić swoje, aby ustawić, które min. wartość.

@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();

}
SALMAN
źródło
Zasadniczo dodałem rozmiar + 10, który automatycznie ustawi min na 10, możesz zmienić swoje, aby ustawić, które min. wartość.
SALMAN
10
Nie używaj komentarzy do wyjaśnienia kodu w odpowiedzi, dołącz go jako część samej odpowiedzi.
Flexo
6

W wersjach API> = 26 możesz teraz dodać minatrybut xml do SeekBar:

android:min="0.2"

João Magalhães
źródło
5

Moje rozwiązanie, które działa dobrze dla mnie, to:

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

} 
Szabolcs Becze
źródło
4

Nie możesz ustawić postępu w float, ponieważ seekbar.getProgress () zawsze zwraca wartość całkowitą. Poniższy kod ustawi wartość textview na 0.2, jeśli wartość seekbar wynosi 0. Możesz zmienić minimumVal zgodnie z wymaganiami.

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

            }
        });
Dharmesz
źródło
1

Możesz spróbować zrobić w ten sposób:

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

        }
    };
Sasha
źródło
0

ten kod działa dla mnie dobrze !!!

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

    }
};
Karthick
źródło
0

W końcu znalazłem sposób na ustawienie seekBar wartości minimalnej , po prostu ustaw setOnSeekBarChangeListenertak:

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

    }
});

Mam nadzieję że to pomoże :)

Behzad Bahmanyar
źródło
0

Oto jak zrobiłem to z Kotlinem:

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()
    }
Riajul
źródło
0

Jeśli używasz com.android.support:preference-v7, SeekBarPreferencema już metodę setMin(int).

Po prostu zadzwoń onCreatePreferences()do swojego PreferenceFragmentCompat.

Wartości XML będą nadal ignorowane w API <26, ale ustawienie ich programowo działa.

arnab321
źródło