2011-10-29 6 views
20

Android에 익숙하지 않아서 질문에 대답하기가 쉽지만 미안합니다. 나는 두 개의 버튼, 감소 및 증가 버튼을 가지고 있으며, 중간에 값을 표시하는 TextView가 있습니다.버튼을 누를 때마다 정수 값이 계속 증가합니다.

내가 감소 버튼을 누르면 TextView의 값이 감소하고 증가 버튼을 눌렀을 때 증가합니다. 문제는 없지만 문제는 그 값이 단지 하나씩 증가/감소한다는 것입니다 딸깍 하는 소리. 내가 달성하고자하는 것은 계속해서 버튼 (예 : 증가 버튼)을 누르면 값이 계속 증가하고 증가 버튼을 놓으면 멈추는 것입니다.

그럴 수 있습니까? 그렇다면이를 구현하는 방법에 대한 몇 가지 샘플 코드 또는 참조를 보여줄 수 있습니까? 감사! 여기

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

이며, 여기 내 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); 
      } 
     }); 

    } 
} 

답변

58

입니다 버튼에.

은 당신의 활동에 핸들러를 만듭니다 상태 것이다

private Handler repeatUpdateHandler = new Handler(); 

그리고 2 바르 : 그것은 증가 또는 감소한다? 한 번에 하나씩 만 설정하십시오.

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

그리고 본 숫자 값

public int mValue; 

그리고 다른 스레드에서 실행됩니다 클래스 :

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

이 버튼을 길게 누르면 리스너를 추가

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

위의 경우에서 butto n은 증가분입니다. mAutoDecrement를 true로 설정하는 다른 버튼을 만듭니다. 당신은 밖으로 증가를 파악

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

:

및 감소()이 같은 인스턴스의 INT 변수를 설정하는 기능이 될 것입니다. 오, REP_DELAY는 50으로 설정된 정적 int 변수입니다.

이것이 제프리 콜 (Jeffrey Cole)의 오픈 소스 NumberPicker에서 발췌 한 것입니다. http://www.technologichron.net/ 올바른 작성자의 속성을 추가해야합니다.

+0

고맙습니다. 분명히 시도해 보겠습니다. :) – src

+0

나는 당신의 지시에 따라'increment()'함수를 만들고 REP_DELAY를 선언했다. 에러는 없지만 increment 버튼을 클릭하면 값은 증가하지만 값을 내더라도 값은 계속 증가하고 있지 않다. 멈추지 마. 감소 버튼도 마찬가지입니다. 내가 놓친 게 있니? – src

+1

죄송합니다. onTouchListener를 추가하는 것을 잊었습니다.이 플래그는 증가 플래그를 지우므로 (감소분과 동일) - 업데이트 된 코드를 확인하십시오. – Yar

2

긴 클릭시 값을 증가시키는 나의 방법은 버튼이 계속 눌러져 있고 값이 증가 하는지를 주기적으로 점검하고, 그렇지 않으면 타이머를 취소하는 것입니다. UI 사용 핸들러를 업데이트합니다.

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

처리기 :

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

내가 늦게 나는이 질문에 대답하지만 더 나은 해답을 찾고 하나를 도움이 될 수 있습니다.

나는 위에서 언급 한 연속 카운터 기능을 달성하기 위해 CounterHandler 클래스와 그 미친 듯이 사용하기 쉬운 클래스를 만들었습니다.

"사용법"예를 통해 다음 요점에서 클래스를 찾을 수 있습니다. https://gist.github.com/nomanr/d142f4ccaf55ceba22e7f7122b55b9b6

샘플 코드

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

그게 전부. :)

관련 문제