2010-06-13 45 views
67

Qualcuno sa come definire un valore minimo di SeekBar? È fatto nel layout XML o devo definirlo in modo programmatico?Valore minimo Android SeekBar

Fondamentalmente ho bisogno di cambiare il mio valore minima dal 0 al 0,2

risposta

102

Ciao, qualcuno sa come definire un valore minimo di SeekBar?

Non è possibile definire il valore minimo. È 0.

Fondamentalmente ho bisogno di cambiare il mio valore minimo da 0 a 0,2

Quando si ottiene il valore, aggiungere 0.2 ad esso.

+0

Si dovrebbe chiamare anche 'setProgress' in modo che il cambiamento si rifletta sull'interfaccia utente - come dimostra Szabolcs Becze nella sua risposta. –

+4

@ user1617737: No, non dovresti. La sua risposta non ha nulla a che fare con il valore minimo. 'SeekBar' rappresenta l'intervallo da 0 a (max-min). Per ottenere il valore corretto, aggiungi il minimo desiderato al progresso effettivo. Dal momento che i progressi effettivi sono già "riflessi sull'interfaccia utente", non c'è nulla da cambiare lì. – CommonsWare

+0

OK, beh, dipende da come sono impostate le etichette. Ho appena fornito una risposta completa che ritengo sia l'unico modo corretto per farlo. http://stackoverflow.com/questions/3033135/android-seekbar-minimum-value/25239248#25239248 –

8

Fondamentalmente ho aggiunto la dimensione + 10 che imposterà automaticamente il minimo a 10 è possibile modificare il proprio per impostarlo quale min. valore.

+0

Fondamentalmente ho aggiunto la dimensione + 10 che imposterà automaticamente il minimo a 10, puoi cambiare il tuo per impostarlo quale min. valore. – SALMAN

+10

Non utilizzare i commenti per spiegare il codice nella risposta, includerlo come parte della risposta stessa. – Flexo

+0

Non c'è un setMin. Mi piacerebbe impostare il minimo su -2 ... – powder366

3

La mia soluzione che funziona bene per me è:

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

} 
12

Ecco quello che uso per ottenere android:max per una gamma max/min per un SeekBar.

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

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

Quindi otterrete l'intervallo minimum to minimum+max;

Per impostare il valore massimo in xml, utilizzare max=(desiredMax-min);

+1

Sì, penso che questo sia l'approccio migliore. Le unità di SeekBar sono solo valori astratti. Puoi semplicemente regolarli in codice per ottenere le unità reali che desideri, quindi ho aumentato la tua risposta. –

5

Il valore minimo deve essere 0 per l'oggetto SeekBar in Java (vale a dire, non può essere modificato), ma questo è come ottenere l'aspetto e le prestazioni richiesti.

Supponiamo che si desidera che il minimo per essere 5 e la vostra massima per il 100 ...

Pertanto, si dispone di una serie di 95, quindi si avrebbe bisogno di impostare il SeekBar con un valore massimo di 95.

Se la barra di ricerca ha le etichette dell'interfaccia utente, le renderei 5 (min) e 100 (max).

Così, l'XML di layout sarebbe qualcosa di simile ...

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

Così ora è possibile introdurre la correzione 5, come questo ...

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

Questa soluzione darà la barra di ricerca indica il minimo, il massimo e la scala corretti sull'interfaccia utente e la posizione del controllo non "salta" a destra se l'utente lo fa scorrere completamente verso sinistra.

+0

Bella spiegazione .. –

2

Non è possibile impostare lo stato di avanzamento in float perché seekbar.getProgress() restituisce sempre un valore intero. Il codice seguente imposta il valore della vista testo su 0,2 se il valore della barra di ricerca è 0. è possibile modificare il valore minimo in base alle proprie esigenze.

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

si può provare a fare in questo modo:

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

questo codice funziona per me bene !!!

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

In versioni API> = 26 è ora possibile aggiungere min attributo XML per SeekBar:

android:min="0.2"

0

ho finalmente trovato un modo per impostare seekBarvalore minimo, insieme appena impostato il tuo setOnSeekBarChangeListener in questo modo:

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

    } 
}); 

Spero che questo aiuti :)

0

Come dicono João Magalhães:

ora è possibile aggiungere l'attributo min xml SeekBar con:

android:min="0.2" 

Ma è meglio per l'API < 26 di utilizzare l'attributo compat;):

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

non esiste tale attributo "app: min". Compile dice no ^^ – GuilhE

0

Ecco come ho fatto con 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() 
    }