Изменить текст в кнопке

#java #android #android-studio

#java #Android #android-studio

Вопрос:

 import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button btn_apple = (Button) findViewById(R.id.button_apple);
    Button btn_cherry = (Button) findViewById(R.id.button_cherry);
    Button btn_orange = (Button) findViewById(R.id.button_orange);
    Button btn_waterLemon = (Button) findViewById(R.id.button_waterlemon);
    btn_apple.setOnClickListener(new View.OnClickListener() {
        boolean action = false;
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.button_apple:
                    if (!action) {
                        action = true;
                        btn_apple.setText("1");
                    }
                    else {
                        int i = Integer.parseInt(btn_apple.getText().toString());
                        btn_apple.setText(String.valueOf(i   1));
                    }
                    break;
                case R.id.button_cherry:
                    action = false;
                    if (!action) {
                        action = true;
                        btn_cherry.setText("1");
                    }
                    else {
                        int i = Integer.parseInt(btn_cherry.getText().toString());
                        btn_cherry.setText(String.valueOf(i   1));
                    }
                    break;
                }
            }
        });
    }
}
 

Мне нужно сделать так, чтобы, если пользователь нажимает на button_apple и не нажимает на него в течение 3 секунд, его текст становится настолько лишним. И если кто-нибудь знает, почему мой текст изменяется в button_apple, но не в button_cherry. Скажите мне, пожалуйста.

Ответ №1:

Вы устанавливаете прослушиватель на своей кнопке Apple. На вишневой кнопке нет прослушивателя.

Пересмотрите то, чего вы пытаетесь достичь, и упростите это.

Если пользователь нажимает на кнопку Apple, вам нужно что-то сделать.

Если пользователь нажимает вишневую кнопку, вам нужно что-то сделать (возможно, что-то еще).

Если пользователь нажимает кнопку watermellon, … и так далее.

 // define your listeners
View.OnClickListener appleListener = new View.OnClickcListener() {
    @Override
    public void onClick(View v) {
        // do whatever you need to do when the apple button is clicked
    }
};

// same thing for cherry listener, make a listener to handle the click action
View.OnClickListener cherryListener = ...

// register the listeners
btnApple.setOnClickListener(appleListener);
btnCherry.setOnClickListener(cherryListener);

...
 

Редактировать

Чтобы что-то произошло через определенное время, вы должны учитывать:

  1. входные данные: какие объекты / переменные влияют на действие
  2. вывод: что должно произойти, если все входные данные действительны
  3. длительность

С Android вы могли бы использовать обработчик. См. Метод postDelayed.

 long delayMillis = 3000L; // duration after which to run your task

Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after the delay in milliseconds
  }
}, delayMillis);
 

Все это должно быть внутри прослушивателя кликов с логикой, которую вам нужно реализовать.

«Если пользователь нажимает на кнопку apple и не нажимает на нее в течение трех секунд»

Вы могли бы сделать что-то вроде

 View.OnClickListener appleListener = new View.OnClickcListener() {
    AtomicInteger clicks = new AtomicInteger(0);

    @Override
    public void onClick(View v) {
        int numClicks = clicks.incrementAndGet();
        if (numClicks == 1) {
            long delayMillis = 3000L; // duration after which to run your task

            Handler handler = new Handler(Looper.getMainLooper());
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (clicks.get() == 1) {
                        // they only clicked once, do whatever you need to do to make the text superfluous
                    }
                    // put the number of clicks back to 0
                    clicks.set(0);
                }
            }, delayMillis);
        }
    } else {
        // TODO
        // it's been clicked more than once
        // show a toast if you need to or do something else
    }
}
 

Я не тестировал это, поэтому вам, вероятно, придется немного изменить его, но это общая идея.

Комментарии:

1. Спасибо, с вопросом о том, почему текст в вишневой кнопке не изменился, я разобрался благодаря вам, но как сделать так, чтобы текст в кнопке менялся через 3 секунды, если пользователь не нажимает на нее?

2. Добро пожаловать в stack overflow. Если ответ был полезен, пожалуйста, подумайте о голосовании. Я обновил ответ на изменение текста кнопки по истечении указанного времени. Он не тестировался, поэтому, возможно, он не идеален, но в нем изложен один из способов решения этой проблемы.