Подтвердить что ты не робот

Отключить всю активность от действия пользователя

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

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

Спасибо, Джейсон

4b9b3361

Ответ 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), когда вам нужно отключить и включить нормальную обработку событий активности.

Ответ 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).