Android SeekBar Mindestwert


81

Wie definiere ich den Mindestwert einer SeekBar? Wird dies im XML-Layout durchgeführt oder muss ich es programmgesteuert definieren?

Grundsätzlich muss ich meinen Mindestwert von 0 auf 0,2 ändern

Antworten:


122

Wie definiere ich den Mindestwert einer SeekBar?

Sie können den Mindestwert nicht definieren. Es ist 0.

Grundsätzlich muss ich meinen Mindestwert von 0 auf 0,2 ändern

Wenn Sie den Wert erhalten, fügen 0.2Sie ihn hinzu.


Sie sollten auch anrufen, setProgressdamit sich die Änderung auf der Benutzeroberfläche widerspiegelt - wie Szabolcs Becze in seiner Antwort demonstriert.
Ban-Geoengineering

4
@ user1617737: Nein, solltest du nicht. Seine Antwort hat nichts mit dem Mindestwert zu tun. Das SeekBarrepräsentiert den Bereich von 0 bis (max-min). Um den angepassten Wert zu erhalten, addieren Sie das gewünschte Minimum zum tatsächlichen Fortschritt. Da der tatsächliche Fortschritt bereits "auf der Benutzeroberfläche reflektiert" ist, gibt es dort nichts zu ändern.
CommonsWare

OK, das hängt davon ab, wie Ihre Etiketten eingerichtet sind. Ich habe gerade eine vollständige Antwort gegeben, die meiner Meinung nach der einzig richtige Weg ist, dies zu tun. stackoverflow.com/questions/3033135/…
Ban-Geoengineering

Stellen Sie das MIN-Label auf den Min-Wert und das MAX-Label auf den Max-Wert. Legen Sie in onProgressChanged () Ihren aktuellen Wert Label als progress + minValue fest.
Rahul Rastogi

22

Hier ist, was ich benutze, um android:maxeinen Max / Min-Bereich für a zu erhalten SeekBar.

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

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

So erhalten Sie die Reichweite minimum to minimum+max;

Um den Maximalwert in xml, Nutzung max=(desiredMax-min);


2
Ja, ich denke, das ist der beste Ansatz. Die Einheiten einer SeekBar sind nur abstrakte Werte. Sie können sie einfach im Code anpassen, um die gewünschten Einheiten zu erhalten. Daher habe ich Ihre Antwort positiv bewertet.
David George

9

Der Mindestwert muss 0 für das SeekBar-Objekt in Java sein (dh er kann nicht geändert werden). Auf diese Weise erhalten Sie jedoch das erforderliche Aussehen und die erforderliche Leistung.

Angenommen, Sie möchten, dass Ihr Minimum 5 und Ihr Maximum 100 beträgt ...

Daher haben Sie einen Bereich von 95, sodass Sie die SeekBar mit einem Maximalwert von einrichten müssen 95.

Wenn Ihre Suchleiste UI-Beschriftungen hat, würden Sie diese 5(min) und 100(max) erstellen .

Das Layout-XML wäre also so etwas wie ...

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

So jetzt können Sie die Einführung 5Korrektur, so ...

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

Diese Lösung gibt Ihrer Suchleiste die richtigen Min-, Max- und Skalierungswerte auf der Benutzeroberfläche, und die Position des Steuerelements springt nicht nach rechts, wenn der Benutzer sie ganz nach links schiebt.


9

Grundsätzlich habe ich die Größe + 10 hinzugefügt, die automatisch die min auf 10 setzt. Sie können Ihre ändern, um die min einzustellen. Wert.

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

}

Grundsätzlich habe ich die Größe + 10 hinzugefügt, die automatisch die min auf 10 setzt. Sie können Ihre ändern, um die min einzustellen. Wert .
Salman

10
Bitte verwenden Sie keine Kommentare, um den Code in Ihrer Antwort zu erläutern. Bitte fügen Sie ihn als Teil der Antwort selbst hinzu.
Flexo

6

In API-Versionen> = 26 können Sie minSeekBar jetzt ein XML-Attribut hinzufügen:

android:min="0.2"


5

Meine Lösung, die für mich gut funktioniert, ist:

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

} 

4

Sie können den Fortschritt in float nicht festlegen, da seekbar.getProgress () immer einen ganzzahligen Wert zurückgibt. Mit dem folgenden Code wird der Textansichtswert auf 0,2 gesetzt, wenn der Suchleistenwert 0 ist. Sie können den Mindestwert entsprechend Ihren Anforderungen ändern.

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

Sie können dies folgendermaßen versuchen:

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

Dieser Code funktioniert gut für mich !!!

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

Ich habe endlich einen Weg gefunden, den seekBar Mindestwert festzulegen . Stellen Sie einfach Ihren WertsetOnSeekBarChangeListener wie folgt ein:

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

    }
});

Hoffe das hilft :)


0

So habe ich das mit Kotlin gemacht:

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

Wenn Sie verwenden com.android.support:preference-v7, hat SeekBarPreferencebereits eine Methode setMin(int).

Rufen Sie das einfach onCreatePreferences()von Ihnen an PreferenceFragmentCompat.

XML-Werte werden in API <26 weiterhin ignoriert, aber das programmgesteuerte Festlegen funktioniert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.