禁用用户操作的整个活动

时间:2010-11-25 20:21:19

标签: android

是否有一种简单的方法可以禁用与活动交互的用户。 要在运行动作时执行(以及标题栏中的旋转进度条)

编辑:因为看起来我不够清楚我的意思是说:虽然我已经有一个旋转的进度条,但用户仍然能够按下活动上的任何按钮,我想禁止用户能够在任务运行时执行此操作。但我不想一个接一个地禁用屏幕上的每个项目。

谢谢,杰森

7 个答案:

答案 0 :(得分:119)

要阻止用户触摸事件,请使用:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

要获取触摸事件,请使用:

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

编辑: 如果要添加禁用和灰显显示的功能,则需要在xml布局文件中添加填充父级的线性布局。将其背景设置为#B0000000,将其可见性设置为Gone。比计划性地将其可见性设置为Visible。

答案 1 :(得分:9)

如果您需要在一段时间内禁用事件处理(例如,在运行动画时显示等待对话框),则可以覆盖活动的调度功能。

要禁用任何按钮上的触摸/点击,请将这些成员/功能添加到您的活动中:

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)

答案 2 :(得分:1)

使用捆绑了ProgressDialog的AsyncTask。

  1. AsyncTask

  2. Progress Dialog

  3. 另一个有用的例子:

    http://www.screaming-penguin.com/node/7746

答案 3 :(得分:0)

我使用自定义方法解决了这个问题 - 我不想这样做:

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);
    }

如果有人找到更好的方式我想听听它!感谢。

答案 4 :(得分:0)

我通过在XML布局的末尾添加一个带有空单击处理程序的全屏空白图像来解决这个问题。

在drawables文件夹中创建一个透明的PNG文件。

在引用图像的XML布局末尾添加全屏ImageView:

...
 <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"
 />

为图像添加null click hander以捕获用户触摸:

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);
}

答案 5 :(得分:0)

Uriel Frankel的代码(可接受的响应)效果很好,但是在我的情况下,我的请求完成后才起作用:(。我想在发生之前阻止它。有人知道我的代码出了什么问题(从此开始..)

(这是一个片段)

   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
}

谢谢(是)

答案 6 :(得分:-2)

标题栏中的SpinningProgress:

//onCreate(): 
activity.requestWindowFeature(FEATURE_INDETERMINATE_PROGRESS);

//and then: 
activity.setProgressBarIndeterminate(boolean indeterminate)

Activity class

另一个选项是使用进度对话框(您可能希望将cancelable设置为false)。