2013-08-15 2 views
0

Я хочу блокировать все взаимодействия с фрагментом, пока не произойдет обратный вызов.Блокирование взаимодействия пользовательского интерфейса с фрагментом

У меня есть две кнопки: ButtonA и ButtonB.

ButtonA показывает индикатор выполнения и запускает асинхронный поток, который обращается к фрагменту, когда это делается. Тем временем кто-то может нажать ButtonB, который я не хочу разрешать.

Моим решением было развернуть еще один фрагмент, который является прозрачным и перехватывает все клики. Однако, как представляется, существует задержка между FragmentManagers commit() и фактически работающим фрагментом.
Я пробовал вызывать executePendingTransactions(), но все же в конечном итоге возникают проблемы с потоками, из-за которых фрагмент не находится в состоянии, чтобы принимать события onClick до того, как пользователь нажал кнопку ButtonB.

Есть ли более элегантное решение?

Спасибо,

Джон

ответ

0

Вызов buttonB.setEnabled (ложь); после нажатия кнопкаA.

CustomButton extends View { 

    private boolean mIsEnabled = true; 

    public void setEnabled (boolean enabled) { 
     this.mIsEnabled = enabled; 
    } 


    @Override 
    public void onClick() { 
      if (mIsEnabled) { 
       mOnClickListener.onClick(); 
      } else { 
       return; 
      } 
    } 


} 
+0

К сожалению, должны были быть указаны пользовательские представления, которые реализуют onClick, которые не выставляют setEnabled (bool) – johncc

+0

Им следует выставить метод setEnabled. Все взгляды должны. – Snicolas

+0

Итак, у вас есть пользовательский вид кнопки? Добавить метод setEnabled к его коду и переопределить метод onClick. @Snicolas - да, каждое представление должно выставлять setEnabled, но согласно android docs - «Интерпретация разрешенного состояния зависит от подкласса». –

0

Другой вариант - использовать фрагмент диалога прогресса и установить его отмену. Он будет охватывать фрагмент и предотвращать получение базового фрагмента любого события касания.

0

Вместо вызова другого фрагмента u может иметь еще один прозрачный вид с диалогом прогресса над текущим представлением и сделать его видимость VIEW или GONE соответственно. Вы можете просто показать диалог prgress с отменным параметром как false.

+0

Я хочу, чтобы @johncc не позволял пользователю нажимать кнопку B, потому что это может вызвать ошибки, а не потому, что он не хочет скрывать диалог прогресса –

0

Я совершенно не понял вопрос. надеюсь, что это может вам помочь. , когда вы добавляете фрагмент transaprent поверх него, делаете прозрачный макет clickable = true

Если вид упоминается как clickable, он не передает события касания до нижних видов.

извините, если я не понимаю ваш вопрос не так.

0

Невозможно нажать кнопку A, чтобы ее содержащая активность была в заданном состоянии (с булевым флагом, поднятым в его слушателе), и кнопка B читала этот флаг перед тем, как делать какие-либо вещи?

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

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