2011-10-29 30 views
20

Soy nuevo en Android, lo siento mucho si la pregunta es fácil de responder. Tengo dos botones, un botón para disminuir y otro para aumentar, y en medio de ellos un TextView que muestra un valor.Aumenta continuamente el valor entero cuando se presiona el botón

Cuando presiono el botón de disminución, el valor en el TextView disminuye y aumenta cuando presiono el botón de aumento, no hay problema con eso, lo conseguí pero el problema es que el valor solo aumenta/disminuye en 1 en un solo hacer clic. Lo que intento lograr es que, al presionar continuamente el botón (el botón de aumento, por ejemplo), el valor también aumenta continuamente y solo se detiene cuando suelto el botón de aumento.

¿Es esto posible? Si es así, ¿puede mostrar algún código de muestra o referencias sobre cómo implementar eso? ¡Gracias!

Aquí es mi main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="center" > 

    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="44dp" 
     android:gravity="center_horizontal" > 

     <Button android:id="@+id/button1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:text="&lt;" /> 

     <TextView android:id="@+id/textView1" 
      android:layout_width="50dp" 
      android:layout_height="fill_parent" 
      android:layout_alignBottom="@+id/button1" 
      android:layout_toRightOf="@+id/button1" 
      android:gravity="center" 
      android:text="45" /> 

     <Button android:id="@+id/button2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentTop="true" 
      android:layout_toRightOf="@+id/textView1" 
      android:text="&gt;" /> 

    </RelativeLayout> 

</RelativeLayout> 

y aquí está mi Main.java

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class Main extends Activity { 

    private Button _decrease; 
    private Button _increase; 
    private TextView _value; 
    private static int _counter = 45; 
    private String _stringVal; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     _decrease = (Button) findViewById(R.id.button1); 
     _increase = (Button) findViewById(R.id.button2); 
     _value = (TextView) findViewById(R.id.textView1); 

     _decrease.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Log.d("src", "Decreasing value..."); 
       _counter--; 
       _stringVal = Integer.toString(_counter); 
       _value.setText(_stringVal); 
      } 
     }); 

     _increase.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       Log.d("src", "Increasing value..."); 
       _counter++; 
       _stringVal = Integer.toString(_counter); 
       _value.setText(_stringVal); 
      } 
     }); 

    } 
} 

Respuesta

58

Para que eso funcione, se necesita un hilo que se actualizará el valor entero cuando pulsación larga en un botón.

crear un controlador en su actividad:

private Handler repeatUpdateHandler = new Handler(); 

y 2 VARs, que indicarán: ¿se aumentará o disminuirá? Solo un juego a la vez.

private boolean mAutoIncrement = false; 
private boolean mAutoDecrement = false; 

y el actual valor del número

public int mValue; 

y una clase que se ejecutará en otro hilo:

class RptUpdater implements Runnable { 
    public void run() { 
     if(mAutoIncrement){ 
      increment(); 
      repeatUpdateHandler.postDelayed(new RptUpdater(), REP_DELAY); 
     } else if(mAutoDecrement){ 
      decrement(); 
      repeatUpdateHandler.postDelayed(new RptUpdater(), REP_DELAY); 
     } 
    } 
} 

Añadir un largo oyente de prensa a su botón:

mBTIncrement.setOnLongClickListener( 
      new View.OnLongClickListener(){ 
       public boolean onLongClick(View arg0) { 
        mAutoIncrement = true; 
        repeatUpdateHandler.post(new RptUpdater()); 
        return false; 
       } 
      } 
    ); 

mBTIncrement.setOnTouchListener(new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      if((event.getAction()==MotionEvent.ACTION_UP || event.getAction()==MotionEvent.ACTION_CANCEL) 
        && mAutoIncrement){ 
       mAutoIncrement = false; 
      } 
      return false; 
     } 
    }); 

En el caso anterior, el butto n es el incremento uno. Crea otro botón que establecerá mAutoDecrement en verdadero.

y decremento() será una función, que fijará la instancia de la variable int así:

public void decrement(){ 
    mValue--; 
    _value.setText(""+mValue); 
} 

Usted calcula el incremento a cabo. Oh y REP_DELAY es una variable estática int establecida en 50.

Veo que este es un extracto del código abierto NumberPicker de Jeffrey Cole disponible en http://www.technologichron.net/ Se debe agregar la atribución del autor apropiado.

+0

gracias, definitivamente intentaré esto. :) – src

+0

seguí sus instrucciones, creé la función 'increment()' y declare 'REP_DELAY', no hay errores, pero cuando hago clic en el botón de incremento, el valor aumenta, pero incluso si lo libero, el valor sigue aumentando y doesn no te detengas Lo mismo ocurre con el botón de disminución. ¿Me estoy perdiendo de algo? – src

+1

Lo sentimos, se olvidó de agregar el onTouchListener, que borrará el indicador de incremento (lo mismo para el decremento). Consulte el código actualizado. – Yar

2

Mi forma de incrementar el valor en clics largos es utilizar el temporizador utilizado para verificar periódicamente si el botón aún está presionado y luego aumentar el valor; de lo contrario, cancelar el temporizador. Para actualizar UI use Handler.

vh.bttAdd.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 

      final Timer timer = new Timer(); 
      timer.schedule(new TimerTask() { 
       @Override 
       public void run() { 
       if(vh.bttAdd.isPressed()) { 
        final int track = ((ChannelAudioTrack) channels.get(vh.getAdapterPosition())).goToNextTrack(); 
        updateUI(vh,track); 
       } 
       else 
       timer.cancel(); 
      } 
      },100,200); 

      return true; 
     } 
    }); 

Handler:

private void updateUI(final TrackViewHolder vh, final int track) 
{ 
new Handler(Looper.getMainLooper()).post(new Runnable() { 
         @Override 
         public void run() { 
            vh.tvTrackNumber.setText(Integer.toString(track)); 
         } 
        }) ; 
} 
1

estoy tarde para responder a esta pregunta, pero puede ayudar a cualquiera que esté buscando una mejor respuesta.

Creé una clase CounterHandler y es increíblemente fácil de usar para lograr la funcionalidad de contador continuo mencionado anteriormente.

Puede encontrar la clase en la siguiente sección con un ejemplo de "cómo usar". https://gist.github.com/nomanr/d142f4ccaf55ceba22e7f7122b55b9b6

Código de ejemplo

new CounterHandler.Builder() 
      .incrementalView(buttonPlus) 
      .decrementalView(buttonMinus) 
      .minRange(-50) // cant go any less than -50 
      .maxRange(50) // cant go any further than 50 
      .isCycle(true) // 49,50,-50,-49 and so on 
      .counterDelay(200) // speed of counter 
      .counterStep(2) // steps e.g. 0,2,4,6... 
      .listener(this) // to listen counter results and show them in app 
      .build(); 

Eso es todo. :)

Cuestiones relacionadas