2

Я стараюсь избегать повторных касаний, но вам нужен чувствительный экран. Используя метод консультировал в этом ответе:Использование обратного отсчета для включения кнопки включения

Android Preventing Double Click On A Button

Я повторное включение кнопки в процессе выполнения программы, но есть некоторые случаи, когда я не могу полагаться на ходе выполнения программы и необходимо обеспечить кнопку включен ,

Я придумал способ повторного включения этой кнопки с помощью countdowntimer и показан в моем коде:

button.setOnTouchListener(new View.OnTouchListener() { 
     @Override public boolean onTouch(View v, MotionEvent event) { 
      disableButton(button); 
      countDwn(); 
      // Do something 
      return false; 
     } 
    }); 

public void disableButton(Button button) { 
    button.setEnabled(false); 
} 

public void enableButton(Button button) { 
    button.setEnabled(true); 
} 

public void countDwn() { 
    CountDownTimer countDownTimer = new CountDownTimer(2000, 1000) { 
     public void onTick(long millisUntilFinished) { 
     } 

     public void onFinish() { 
      enableButton(button); 
     } 
    }.start(); 
} 

Что меня беспокоит, что это может быть неуклюжим или неэффективным способом идти о это. Мне нужен совет об этом, и если у кого-то есть более элегантное предложение?

+0

Почему вы, устанавливающего таймер обратного отсчета для повторного включения кнопки? Вы могли бы закончить свои задачи и в конце задачи включить кнопку. –

+0

@ deepu513, если вы прочитаете вопрос, я объяснил это. –

+1

Все операции находятся внутри метода onTouch(), поэтому при касании кнопки он будет задерживаться на определенное время.Вместо этого вы можете переключать логическую переменную и проверять ее на включение/выключение таймера. –

ответ

2

Я не уверен, что установка кнопки для включения = ложь - это правильный способ решить «Повторные штрихи» вопрос.

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

Предотвращение Повторные Прикосновения

Я предлагаю простое решение, предотвратить действие, если время от последнего действия меньше, чем MINIMUM_ACTION_DELAY.

Если вы хотите получить анимацию клика, не допускайте действия на слушателе onClick. Если вы не хотите анимацию кликов, запретите действие в onTouch.

Например, OnClick будет что-то вроде этого:

button.setOnClickListener(new View.OnClickListener() { 

    private long mLastActionTime; 

    @Override 
    public void onClick(View v) { 
     long currentTime = System.currentTimeMillis(); 
     if (currentTime - mLastActionTime < MINIMUM_ACTION_DELAY) { 
      // Too soon, we don't want to handle this event 
      return; 
     } 

     // Save the action time 
     mLastActionTime = currentTime; 

     // Execute action 
     // TODO do something 
    } 
}); 
+0

Мне нравится это решение. Но что происходит при первом щелчке, поскольку «mLastActionTime» не был инициализирован? Добавить другое условие? –

+0

Не нужно, поскольку mLastActionTime инициализируется до 0, условие минимального времени всегда будет не выполняться в первый раз. Попробуйте :) –

+0

Yeh, я не был уверен, была ли им предоставлена ​​инициализация по умолчанию (похмелье от обучения C). Я попробую и вернусь к вам :) –

1

Другим решением является создание пользовательских Button, что вы можете использовать все времена, которые вы хотите, без перезаписи менеджер таймера. Может быть что-то вроде этого:

public class OneTimeButton extends Button { 
    private int timoeut; 
    private CountDownTimer timer = null; 


    @Override 
    public boolean performClick() { 
     boolean result = super.performClick(); 

     if(timer!=null && timoeut > 0){ 
      setEnabled(false); 
      timer.start(); 
     } 

     return result; 
    } 

    public OneTimeButton(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     TypedArray a = context.getTheme().obtainStyledAttributes(
       attrs, 
       R.styleable.OneTimeButton, 
       0, 0); 

     try { 
      timoeut = a.getInteger(R.styleable.OneTimeButton_timeout, 0); 
      setTimer(); 
     } finally { 
      a.recycle(); 
     } 
    } 

    private void setTimer() { 
     timer = new CountDownTimer(timoeut, timoeut) { 
      @Override 
      public void onTick(long millisUntilFinished) {} 

      @Override 
      public void onFinish() { 
       setEnabled(true); 
      } 
     }; 
    } 

    public OneTimeButton(Context context) { 
     super(context); 
    } 

    public OneTimeButton(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 
} 

Определить файл attrs.xml в \ дорожит папке:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="OneTimeButton"> 
     <attr name="timeout" format="integer" /> 
    </declare-styleable> 
</resources> 

Тогда просто в вызове XML

<it.your_package_name.OneTimeButton 
     android:id="@+id/test_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="TEST" 
     custom:timeout="5000"/> 

Вы можете назначить тайм-аут вы хотите (в миллисекундах) атрибут custom:timeout.

Не забудьте объявить в макете (на верхнем уровне ViewGroup) это:

xmlns:custom="http://schemas.android.com/apk/res-auto" 
+0

Мне очень нравится это решение. Проблема, которую я испытываю, заключается в тестировании моего приложения, я должен учитывать все поведение пользователя, и есть слишком много перестановок, например. back button и т. д., я не могу полагаться на поток программы, чтобы снова включить его. Также вы используете только один тик, что также лучше. –

+0

Umm, если вам нужно выполнить операцию, которая продолжается за пределами жизненного цикла компонента (например, жизненный цикл компонента), возможно, вам нужен другой компонент, например Service (который продолжает работать в фоновом режиме). Может быть так? – GVillani82

+0

Джозеф, в основном это касается фрагментов, кнопок внутри действия и фрагментов этой деятельности. Когда я оставляю активность и возвращаюсь к ней, нет проблем, так как в xml я устанавливаю ее на включенную. –

Смежные вопросы