Android: установите OnOnClickListener для кнопок.Стреляет дважды при слишком быстром нажатии - PullRequest
2 голосов
/ 08 ноября 2011

У меня проблема с приложением, которое я сейчас создаю для телефонов Android. У меня есть активность, которая имеет две кнопки. Суть в том, что если я нажимаю обе кнопки достаточно быстро (это нехорошее поведение пользователя), эти две кнопки срабатывают, в то время как я хочу просто активировать (самое большее) только одну из них. Это фрагмент кода для примера, что я имею в виду:

public class ActivityLevels extends Activity {

private boolean launched;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //Set the content view of the screen
    setContentView(R.layout.levels);

    //Set lauched flag to false
    launched = false;

    //Initialize buttons
    Button loadLevel01 = (Button) findViewById(R.id.ButtonLoadLevel01);
    Button loadLevel02 = (Button) findViewById(R.id.ButtonLoadLevel02);

    //Set Button Listeners
    loadLevel01.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            launchGame(0);
        }
    });

    loadLevel02.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            launchGame(1);
        }

    });
}

private void launchGame(int level) {

    //Just launch the activity if !lanched
    if(!launched) {
        launched = true;
        //Start Activity
    }
}
}

Я проверял интернет в течение недели или около того, и не нашел никакого способа предотвратить это. Насколько я обнаружил, похоже, что кто-то уже опубликовал подобную проблему здесь: Выпуск 20073: Кнопка прослушивания onClick может быть запущена дважды, даже если кнопка отключена немедленно в слушателе

Кстати, я также пытался отключить кнопку непосредственно перед вызовом launchGame (int), но ничего не добился. Этот код является всего лишь адаптированным фрагментом всей деятельности. Я думаю, что все в порядке, чтобы понять, что я имею в виду, но если вам нужно другое описание, пожалуйста, дайте мне знать.

Заранее спасибо, и извините за любые орфографические ошибки, мой английский совсем не очень хорош.

Ответы [ 5 ]

6 голосов
/ 09 ноября 2011

Я действительно решил мой вопрос. Цель состояла в том, чтобы сделать мой метод launchGame(int level) синхронизированным, чтобы к нему нельзя было получить доступ более одного раза до его завершения. Таким образом, скажем, у нас есть два потока от слушателей щелчков, потому что я нажал кнопку один и кнопку два очень очень быстро: с синхронизированным методом он будет называться lauchGame(1), завершить действие, а затем launchGame(2) с boolean launched флаг установлен на true.

Вот что я сделал:

private void synchronized launchGame(int level) {

    //Just launch the activity if !lanched
    if(!launched) {
        launched = true;
        //Start Activity
    }
}

В любом случае, большое спасибо за все ваши ответы!

1 голос
/ 08 ноября 2011

Вы можете использовать один onclicklistener для них обоих и защитить все содержимое с помощью мьютекса.

0 голосов
/ 08 ноября 2011

Как уже упоминалось, очистите onclicklistener на том, что вы не хотите вызывать.Я бы проголосовал за это.Тем не менее, вы также можете попытаться вызвать 'finish' для этого действия в обработчике нажатия кнопки.Я не уверен, что это будет поток, который вы хотите, но я думаю, что он предотвратит другие звонки (хотя не пробовал).

0 голосов
/ 08 ноября 2011

попробуйте заблокировать кнопку с вашим запущенным состоянием

loadLevel01.setOnClickListener(new View.OnClickListener() {
    public void onClick(View view) {
        if (launched) return;            
        launchGame(0);
    }
});
0 голосов
/ 08 ноября 2011

Вы можете установить OnClickListener "другой" кнопки на null в пределах одной из нажатых кнопок.

...