Кнопка нажата один раз, и кнопка удерживает значение приращения (непрерывно)

Я делаю кнопку, которая увеличивает значение, когда нажмите один раз и удерживайте нажатой кнопку. Пока кнопка удерживается, значение будет увеличиваться. Мне сказали использовать onTouch вместо onClick для этого, но я не смог найти правильный способ сделать это. Приведенный ниже код работает только для нажатия один раз. Спасибо.

public class MainActivity extends AppCompatActivity {
int i = 0;
TextView textView;
Button button;


@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button=findViewById(R.id.button);
    textView=findViewById(R.id.textView);

    button.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            if (event.getAction() == MotionEvent.ACTION_UP){
                setText();
            }
            return true;
        }
        });

}//oncreate
public void setText(){
    textView.setText(""+i);
    i++;
}
}//class

person Grey    schedule 17.07.2018    source источник
comment
вы хотите отключить долгое нажатие кнопки?   -  person Hemant Parmar    schedule 17.07.2018
comment
нет. Я хочу реализовать оба варианта. они могут увеличиваться одним щелчком мыши или долгим нажатием кнопки (для более быстрого увеличения)   -  person Grey    schedule 17.07.2018
comment
хорошо, посмотрите это   -  person Hemant Parmar    schedule 17.07.2018
comment
@HemantParmar спасибо, это сделало шарм.   -  person Grey    schedule 17.07.2018
comment
Добро пожаловать!! рада помочь вам!   -  person Hemant Parmar    schedule 17.07.2018


Ответы (4)


сочетание MotionEvent.ACTION_DOWN и таймера является ключевым. вы запустите таймер при касании и отмените при касании, например:

в действии:

//timer for increment
Timer fixedTimer = new Timer();

void initTimer() {
    fixedTimer = new Timer();

}

при регистрации таймера:

btn.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN)
            {
                fixedTimer.scheduleAtFixedRate(new TimerTask() {
                    @Override
                    public void run() {
                        //increment here
                    }
                }, DELAY,INTERVAL_PERIOD_FOR_INCREMENT);
            }
            else if (event.getAction() == MotionEvent.ACTION_UP)
            {
                //cancel timer
                fixedTimer.cancel();
            }

            return false;
        }
    });
person maheryhaja    schedule 17.07.2018

Вам необходимо использовать MotionEvent.ACTION_DOWN, используя приведенный ниже код, чтобы получить правильный результат.

 button.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if (event.getAction() == MotionEvent.ACTION_DOWN){
            setText();
        }
        return true;
    }
    });

Теперь, когда вы удерживаете кнопку нажатой, значение увеличивается, а при увеличении действия ничего не происходит.

Надеюсь, это поможет.

person Sukhbir    schedule 17.07.2018
comment
это для одиночного приращения или для продолжения приращения (пока я нажимаю кнопку) - person Grey; 17.07.2018
comment
да точно, вы хотите непрерывное приращение всего за один щелчок? - person Sukhbir; 17.07.2018

Замените MotionEvent.ACTION_UP на

MotionEvent.ACTION_DOWN

для кнопки нажата

mButton.setOnTouchListener(new OnTouchListener()
        {

            @Override
            public boolean onTouch(View v, MotionEvent event)
            {
                if (event.getAction() == MotionEvent.ACTION_DOWN)
                    Log.d("Pressed", "Button pressed");
                else if (event.getAction() == MotionEvent.ACTION_UP)

                 Log.d("Released", "Button released");
                // TODO Auto-generated method stub
                return false;
            }
        });
person Himanshu itmca    schedule 17.07.2018

попробуйте этот код:

final CountDownTimer countDownTimer=new CountDownTimer(Long.MAX_VALUE,1000) {
            @Override
            public void onTick(long l) {
                int i= Integer.parseInt(finalTxtView.getText().toString());
                finalTxtView.setText(String.valueOf(++i));
            }

            @Override
            public void onFinish() {

            }
        };

        btnPresMe.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction()==MotionEvent.ACTION_DOWN)
                {
                    countDownTimer.start();
                }
                if (motionEvent.getAction()==MotionEvent.ACTION_UP)
                {
                    countDownTimer.cancel();
                }
                return false;
            }
        });

Значение будет увеличиваться через каждую 1 секунду, когда вы удерживаете кнопку. вы можете изменить 1000 (1 сек) в соответствии с вашими требованиями.

person Suraj Vaishnav    schedule 17.07.2018