android-从用户操作禁用整个活动
有没有一种简单的方法可以禁止用户与活动进行交互。当有动作正在运行时执行(标题栏中有旋转进度条)
编辑:似乎我还不太清楚,我想说的是:虽然我已经有了一个旋转的进度栏,但是用户仍然可以按活动上的任何按钮,但是我想禁止用户在执行该操作的同时 任务正在运行。 但是,我不想逐个禁用屏幕上的每个项目。
谢谢,杰森
Jason asked 2020-07-01T03:07:35Z
7个解决方案
126 votes
为了阻止用户触摸事件,请使用:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
要获取触摸事件,请使用:
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
编辑:如果要添加禁用和灰色显示功能,则需要在xml布局文件中添加填充父级的线性布局。 将其背景设置为#B0000000并将其可见性设置为消失。 比以编程方式将其可见性设置为“可见”。
Uriel Frankel answered 2020-07-01T03:08:06Z
9 votes
如果需要一段时间禁用事件处理(例如,在运行动画时显示等待的对话框),则可以覆盖活动的调度功能。
要禁用触摸/单击任何按钮,请将以下成员/功能添加到您的活动中:
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)。
ricosrealm answered 2020-07-01T03:08:35Z
1 votes
捆绑使用带有ProgressDialog的AsyncTask。
异步任务
进度对话框
另一个有用的例子:
[HTTP://呜呜呜.screaming-penguin.com/node/7746]
Vladimir Ivanov answered 2020-07-01T03:09:12Z
0 votes
我已经使用自定义方法解决了此问题-我不想这样做:
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);
}
如果有人找到更好的方法,我想听听! 谢谢。
Jason answered 2020-07-01T03:09:36Z
0 votes
我通过在XML布局的末尾添加一个带有空单击处理程序的全屏空白图像来解决此问题。
在drawables文件夹中创建一个透明的PNG文件。
在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);
}
PKanold answered 2020-07-01T03:10:13Z
0 votes
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
}
谢谢你)
Diego Paredes Arenas answered 2020-07-01T03:10:51Z
-2 votes
标题栏中的SpinningProgress:
//onCreate():
activity.requestWindowFeature(FEATURE_INDETERMINATE_PROGRESS);
//and then:
activity.setProgressBarIndeterminate(boolean indeterminate)
都在活动课
另一个选项是使用“进度对话框”(您可能希望将cancelable设置为false)。
Pedro Loureiro answered 2020-07-01T03:11:20Z