代码之家  ›  专栏  ›  技术社区  ›  Jason

从用户操作中禁用整个活动

  •  42
  • Jason  · 技术社区  · 15 年前

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

    编辑:似乎我还不够清楚,我想说的是:虽然我已经有了一个旋转的进度条,但用户仍然可以按活动上的任何按钮,我想禁用用户在任务运行时可以这样做。不过,我不想逐个禁用屏幕上的每个项目。

    谢谢,杰森

    6 回复  |  直到 15 年前
        1
  •  129
  •   Uriel Frankel    13 年前

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

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

    要恢复触摸事件,请使用:

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

    编辑: 如果要添加disable和greyed out display功能,则需要在xml布局文件中添加填充父级的线性布局。将其背景设置为“b000000”,将其可见性设置为“消失”。而不是通过编程将其可见性设置为可见。

        2
  •  9
  •   ricosrealm    10 年前

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

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

    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
  •  1
  •   Vladimir Ivanov    15 年前

    将AsyncTask与ProgressDialog绑定使用。

    1. AsyncTask

    2. Progress Dialog

    另一个有用的例子:

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

        4
  •  0
  •   TWiStErRob    9 年前

    我已经用自定义方法解决了这个问题—我不想这样做:

    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
  •  0
  •   PKanold    9 年前

    我通过在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"
     />
    

    为要捕获用户触摸的图像添加空的单击处理程序:

    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
  •  0
  •   Mahesh Jamdade    6 年前

    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
    }
    

    谢谢(Y)

        7
  •  -2
  •   Pedro Loureiro    15 年前

    标题栏中的旋转进度:

    //onCreate(): 
    activity.requestWindowFeature(FEATURE_INDETERMINATE_PROGRESS);
    
    //and then: 
    activity.setProgressBarIndeterminate(boolean indeterminate)
    

    两者都在 Activity class

    另一个选项是使用Progress Dialog(您可能希望将其cancelable设置为false)。