android怎样禁用整个布局点击,android-从用户操作禁用整个活动

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值