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:
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.2
Sie ihn hinzu.
SeekBar
reprä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.
Hier ist, was ich benutze, um android:max
einen 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)
;
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 5
Korrektur, 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.
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();
}
In API-Versionen> = 26 können Sie min
SeekBar jetzt ein XML-Attribut hinzufügen:
android:min="0.2"
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
}
}
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) {
}
});
Ich habe diese einfache Bibliothek erstellt, es ist nicht viel, aber es kann Ihnen einige Zeit sparen.
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) {
}
};
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) {
}
};
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 :)
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()
}
Wenn Sie verwenden com.android.support:preference-v7
, hat SeekBarPreference
bereits 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.
setProgress
damit sich die Änderung auf der Benutzeroberfläche widerspiegelt - wie Szabolcs Becze in seiner Antwort demonstriert.