按下按钮时连续增加整数值

src*_*src 28 events android button

我是Android新手,很抱歉,这个问题很容易回答.我有两个按钮,一个减少按钮和一个增加按钮,在它们中间有一个显示值的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>
Run Code Online (Sandbox Code Playgroud)

这是我的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);
            }
        });

    }
}
Run Code Online (Sandbox Code Playgroud)

Yar*_*Yar 80

要使其工作,您需要一个线程,当您长按按钮时,该线程将更新整数值.

在您的活动中创建处理程序:

private Handler repeatUpdateHandler = new Handler();
Run Code Online (Sandbox Code Playgroud)

并且将说明2个变量:是增量还是减量?一次只能设置一个.

private boolean mAutoIncrement = false;
private boolean mAutoDecrement = false;
Run Code Online (Sandbox Code Playgroud)

和现在的数值

public int mValue;
Run Code Online (Sandbox Code Playgroud)

还有一个将在另一个线程中运行的类:

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 );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为您的按钮添加长按监听器:

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;
        }
    });  
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,按钮是增量按钮.创建另一个按钮,将mAutoDecrement设置为true.

而decrement()将是一个函数,它将像你这样设置你的实例int变量:

public void decrement(){
    mValue--;
    _value.setText( ""+mValue );
}
Run Code Online (Sandbox Code Playgroud)

你计算出增量.哦,REP_DELAY是一个设置为50的静态int变量.

我看到这是Jeffrey Cole在http://www.technologichron.net上提供的开源NumberPicker的摘录 .必须添加正确作者的归属.

  • 对不起,忘了添加onTouchListener,它将清除增量标志(相同的减量) - 请参阅更新的代码. (2认同)

jma*_*art 7

虽然接受的答案是完全正确的,但可以稍微简化一下。

基本上,我们可以优化两件事:

  • 我们不需要 OnTouchListener。
  • 我们可以将可运行对象实例化一次,而不是创建多个对象。

所以这是我的版本:

// global variables
Handler handler = new Handler();
Runnable runnable;

increaseView.setOnLongClickListener(new View.OnLongClickListener() {

    @Override
    public boolean onLongClick(View v) {

        runnable = new Runnable() {
            @Override
            public void run() {
                if (!increaseView.isPressed()) return;
                increaseValue();
                handler.postDelayed(runnable, DELAY);
            }
        };

        handler.postDelayed(runnable, DELAY);
        return true;

    }

});
Run Code Online (Sandbox Code Playgroud)

这里可运行对象被重用。当视图不再被按下时,它将停止调用自己。

减少视图或按钮可以用类似的方式定义。


Nom*_*que 6

我回答这个问题很晚,但它可能会帮助任何正在寻找更好答案的人。

我创建了一个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();
Run Code Online (Sandbox Code Playgroud)

就这样。:)


Wik*_*ski 5

我长按时增加值的方法是使用计时器,该计时器用于定期检查按钮是否仍处于按下状态,然后增加值,否则取消计时器。要更新UI,请使用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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

处理程序:

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));
                        }
                    }) ;
}
Run Code Online (Sandbox Code Playgroud)