Отключить всю активность от действия пользователя
Есть ли простой способ отключить пользователя, взаимодействующего с активностью.
Выполнение, когда выполняется действие (и индикатор выполнения в строке заголовка)
EDIT: Как мне кажется, я не был достаточно ясен, я хотел сказать: хотя у меня уже есть индикатор выполнения, пользователь все еще может нажать любую кнопку на этом мероприятии, я хочу отключить пользователя от возможности сделайте это, пока задача запущена. Я не хочу, однако, отключать каждый элемент на экране один за другим.
Спасибо, Джейсон
Ответы
Ответ 1
Чтобы заблокировать события пользовательского касания, используйте:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
Чтобы вернуть события касания, используйте:
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
EDIT:
Если вы хотите добавить функцию отключения и отображения серых цветов, вам нужно добавить в свой файл макета xml линейный макет, который заполняет родителя. Установите фон на # B0000000 и его видимость на Gone. Затем программно установите видимость на Visible.
Ответ 2
Если вам нужно отключить обработку событий в течение определенного периода времени (например, при запуске анимации, покажите диалоговое окно ожидания), вы можете переопределить функции диспетчеризации активности.
Чтобы отключить сенсорные кнопки/кнопки на любых кнопках, добавьте эти элементы/функции в свою деятельность:
protected boolean enabled = true;
public void enable(boolean b) {
enabled = b;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return enabled ?
super.dispatchTouchEvent(ev) :
true;
}
Затем просто вызовите enable(true/false)
, когда вам нужно отключить и включить нормальную обработку событий активности.
Ответ 3
Использовать AsyncTask с помощью пакета ProgressDialog.
другой полезный пример:
http://www.screaming-penguin.com/node/7746
Ответ 4
Я решил это с помощью специального метода, который я не хотел делать:
public static void setViewGroupEnabled(ViewGroup view, boolean enabled)
{
int childern = view.getChildCount();
for (int i = 0; i< childern ; i++)
{
View child = view.getChildAt(i);
if (child instanceof ViewGroup)
{
setViewGroupEnabled((ViewGroup) child, enabled);
}
child.setEnabled(enabled);
}
view.setEnabled(enabled);
}
Если кто-нибудь найдет лучший способ, я бы хотел услышать об этом! Спасибо.
Ответ 5
Я решил это, добавив полноэкранное пустое изображение с обработчиком нулевого щелчка в конце на макете XML.
Создайте прозрачный PNG файл в папке drawables.
Добавить полный экран ImageView в конце XML-макета, ссылающегося на изображение:
...
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:srcCompat="@drawable/img_mask"
android:id="@+id/imgMask"
android:scaleType="fitXY"
android:visibility="gone"
android:onClick="doNothingClick"
/>
Добавьте обработчик нулевого щелчка для изображения, чтобы зафиксировать пользовательские касания:
public void doNothingClick(View v){
// do nothing with the click
}
Добавьте код для отключения пользователя:
private void StopTouches(int duration){
findViewById(R.id.imgMask).setVisibility(View.VISIBLE);
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
findViewById(R.id.imgMask).setVisibility(View.GONE);
}
}, duration);
}
Ответ 6
Код Уриэля Франкеля (принятый ответ), работает хорошо, но в моем случае работает после того, как мой запрос это сделал :(. Я хочу заблокировать, прежде чем это произойдет. Кто-то знает, что не так в моем коде (я начинаю с этого..)
(это фрагмент)
login_login_btn.setOnClickListener {
if (validateInputs()){
showSpinner()
thread {
doLogin()
}
} else {
validationError("Validation Error","Checkout your inputs. Common errors: \npassword (at least 8 characters)")
}
}
}
Функция после OnViewCreated
fun showSpinner(){
activity?.window?.setFlags(
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
spinner.visibility = View.VISIBLE
}
Спасибо (Y)
Ответ 7
SpinningProgress в строке заголовка:
//onCreate():
activity.requestWindowFeature(FEATURE_INDETERMINATE_PROGRESS);
//and then:
activity.setProgressBarIndeterminate(boolean indeterminate)
как в Класс действия
Другой вариант - использовать диалог выполнения (вы можете установить на нем значение cancelable).