在Android中按下按钮时连续触发事件

时间:2012-08-22 10:24:16

标签: android

我有ButtonTextView。最初单击按钮i增加计数值并显示在TextView中。我以前使用的代码是。

buttonDayPlus.setOnClickListener(new OnClickListener() 
{               
     @Override
     public void onClick(View v) 
     {
     count = count + 1;
         textView.setText(Integer.toString(count));
     }
}

但是现在我想要的是如果用户按下了按钮,那么我想一个接一个地递增值并在textView中显示增量值,并且一旦用户举起手......最终增量值显示在textView中。所以如果有人知道帮助我解决这个问题

5 个答案:

答案 0 :(得分:7)

您需要使用Handler对象,因为您必须实现一个单独的线程来递增/递减

public class MainActivity extends Activity {

    private boolean autoIncrement = false;
    private boolean autoDecrement = false;
    private final long REPEAT_DELAY = 50;
    private Handler repeatUpdateHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.input);

        class RepetitiveUpdater implements Runnable {

            @Override
            public void run() {
                if (autoIncrement) {
                    increment();
                    repeatUpdateHandler.postDelayed(new RepetitiveUpdater(), REPEAT_DELAY);
                } else if (autoDecrement) {
                    decrement();
                    repeatUpdateHandler.postDelayed(new RepetitiveUpdater(), REPEAT_DELAY);
                }
            }

        }

        up.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                increment();
            }
        });

        up.setOnLongClickListener(new OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                autoIncrement = true;
                repeatUpdateHandler.post(new RepetitiveUpdater());
                return false;
            }
        });

        up.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP && autoIncrement) {
                    autoIncrement = false;
                }
                return false;
            }
        });

    }

    public void increment() {
        if (i < 100) {
            i++;
            TextView no = (TextView) findViewById(R.id.no);
            no.setText(String.valueOf(i));
        }

    }

}

为减量做同样的事。

礼貌:Github,作者:Jeffrey F. Cole

答案 1 :(得分:4)

我刚才在这里回答了这个问题 https://stackoverflow.com/a/41466381/2991628

我创建了一个CounterHandler类来完成所有的计数和事件处理。这是它的工作原理。

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

你可以从我的要点中找到这个课程 https://gist.github.com/nomanr/d142f4ccaf55ceba22e7f7122b55b9b6

答案 2 :(得分:2)

您应该使用OnTouchListener而不是OnClickListener。

但是,你的问题含糊不清。如果要在释放按钮时仅增加一次值,则可以执行以下操作:

button.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            count++;
        }
    }
};

如果您想在用户按住按钮时增加计数,您可以这样做:

button.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        count++;
        myTextView.setText("Click count: "+count);
    }
};

myTextView当然是textview,你想要显示点击次数。

答案 3 :(得分:0)

使用像这样的自定义触控器

public class CustomTouchListener implements View.OnTouchListener {     
    public boolean onTouch(View view, MotionEvent motionEvent) {
    switch(motionEvent.getAction()){            
            case MotionEvent.ACTION_DOWN:
           count = count + 1;
                break;          
            case MotionEvent.ACTION_CANCEL:             
            case MotionEvent.ACTION_UP:
          textView.setText(Integer.toString(count));
                break;
    } 
        return false;   
    } 
}

并将这些监听器设置为您的按钮。可以帮到你。

答案 4 :(得分:0)

正如@shalini给出的答案是正确的,但根据您的要求,几乎没有变化

public class CustomTouchListener implements View.OnTouchListener {     
    public boolean onTouch(View view, MotionEvent motionEvent) {
    switch(motionEvent.getAction()){            
            case MotionEvent.ACTION_DOWN:
               count = count + 1;
               textView.setText(Integer.toString(count));
            break;          

           case MotionEvent.ACTION_CANCEL:             

           case MotionEvent.ACTION_UP:

                break;
    } 
        return false;   
    } 
}