2011-10-29 21 views
20

Jestem nowy na Androida, więc przepraszam, jeśli odpowiedź na to pytanie jest łatwa. Mam dwa przyciski, przycisk zmniejszania i zwiększania, a w środku tekst TextView wyświetlający wartość.Ciągle zwiększaj wartość całkowitą po naciśnięciu przycisku.

Po naciśnięciu przycisku zmniejszania wartość w widoku TextView zmniejsza się i zwiększa się po naciśnięciu przycisku zwiększania, nie ma problemu z tym, mam to działa, ale problem polega na tym, że wartość zwiększa się/zmniejsza o 1 na pojedynczym Kliknij. Próbuję osiągnąć to, że gdy ciągle naciskam przycisk (np. Przycisk zwiększania), wartość ta stale rośnie i zatrzymuje się dopiero po zwolnieniu przycisku zwiększania.

Czy to możliwe? Jeśli tak, czy możesz pokazać przykładowy kod lub referencje dotyczące tego, jak to zrobić? Dzięki!

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

i tu jest moje 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); 
      } 
     }); 

    } 
} 

Odpowiedz

58

Do tego do pracy, trzeba nić, która będzie aktualizować wartość całkowitą, gdy długie naciśnięcie na przycisku.

utworzyć uchwyt w swojej działalności:

private Handler repeatUpdateHandler = new Handler(); 

oraz 2 vars która Stan: jest to zwiększyć lub zmniejszyć? Tylko jeden zestaw na raz.

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

a obecna wartość liczbowa

public int mValue; 

I klasa, która będzie działać w innym wątku:

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

dodać długie naciśnięcie słuchacza do przycisku:

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

W powyższym przypadku butto n oznacza przyrost. Stwórz kolejny przycisk, który ustawi mAutoDecrement na true.

I ubytek() będzie funkcją, która będzie ustawić zmienną instancji int tak:

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

dowiedzieć przyrost zewnątrz. Oh i REP_DELAY to statyczna zmienna int ustawiona na 50.

Widzę, że jest to fragment z otwartego kodu źródłowego Jeffreya Cole'a, dostępnego pod numerem http://www.technologichron.net/ Należy dodać prawidłowe przypisanie autora.

+0

dziękuję, na pewno spróbuję tego. :) – src

+0

podążyłem za twoimi instrukcjami, utworzyłem funkcję 'increment()' i zadeklarowałem 'REP_DELAY', bez błędów, ale kiedy kliknę przycisk inkrementacji, wartość wzrasta, ale nawet jeśli ją zwolnię, wartość wciąż rośnie i robi się przestań. To samo dotyczy przycisku zmniejszania. Czy czegoś brakuje? – src

+1

Przepraszamy, zapomniałem o dodaniu onTouchListener, które wyczyści flagę inkrementacji (to samo dla dekrementacji) - zobacz zaktualizowany kod. – Yar

2

Moim sposobem zwiększania wartości przy długim kliknięciu jest użycie Zegara, który jest używany do okresowego sprawdzania, czy przycisk jest nadal naciśnięty, a następnie zwiększenia wartości, w przeciwnym razie anuluje timer. Aby zaktualizować UI, użyj 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

Jestem późno, aby odpowiedzieć na to pytanie, ale może pomóc każdemu, kto szuka lepszej odpowiedzi.

Stworzyłem klasę CounterHandler i jej niesamowicie łatwą w użyciu, aby osiągnąć wspomnianą funkcję ciągłego licznika.

Lekcję można znaleźć w poniższym tekście z przykładem "jak używać". https://gist.github.com/nomanr/d142f4ccaf55ceba22e7f7122b55b9b6

Przykładowy kod

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

To wszystko. :)

Powiązane problemy