2011-10-29 18 views
20

私はAndroidを初めて使いました。私は2つのボタン、減少と増加のボタンがあり、その中に値を表示するTextViewがあります。ボタンを押しても整数値が連続的に増加する

私が減少ボタンを押すと、増加ボタンを押したときにTextViewの値が減少し増加しますが、問題はありませんが、問題はありませんが、値は1つだけ増減しますクリック。私が達成しようとしているのは、ボタン(継続ボタンなど)を連続して押しても、値が連続的に増加していて、増加ボタンを放すと停止するということです。

これは可能ですか?もしそうなら、それを実装する方法に関するいくつかのサンプルコードまたは参照を表示できますか?ありがとう!ここで

は私の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 VARSを:それは増減されますか?一度に1つだけ設定します。

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変数です。http://www.technologichron.net/で利用可能なJeffrey ColeのオープンソースのNumberPickerの抜粋です。著者の帰属を追加する必要があります。

+0

ありがとう、私はこれを間違いなく試みます。 :) – src

+0

あなたの指示に従い、 'increment()'関数を作成し、 'REP_DELAY'を宣言しました。エラーは表示されませんが、インクリメントボタンをクリックすると値は増加しますが、止まらない。同じことが減少ボタンと一緒になります。何か不足していますか? – 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クラスを作成し、上記の連続カウンタ機能を達成するために非常に使い方が簡単です。

「使い方」の例では、クラスを次のgistで見つけることができます。すべてのthats 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(); 

。 :)

関連する問題