当ProgressBar在android中可见时,如何禁用用户交互?

当ProgressBar在android中可见时,如何禁用用户交互?,android,user-interface,progress-bar,Android,User Interface,Progress Bar,我正在使用自定义进度条。现在,当任务正在进行时,我将显示进度条,但用户仍然可以与视图和控件交互。 当ProgressDialog可见时,如何像ProgressDialog一样禁用整个视图上的用户交互 我是否需要在主视图顶部使用透明视图,并在该视图上显示进度条,并在任务完成后隐藏该视图 或者只是获取我的parentView的id并将其设置为禁用?但是,我将无法使背景变暗,就像视图/活动/片段上出现对话框时发生的情况一样。对吧? 我只想知道在progressbar可见时,如何禁止用户进行任何交互 感

我正在使用自定义进度条。现在,当任务正在进行时,我将显示进度条,但用户仍然可以与视图和控件交互。 当ProgressDialog可见时,如何像ProgressDialog一样禁用整个视图上的用户交互

我是否需要在主视图顶部使用透明视图,并在该视图上显示进度条,并在任务完成后隐藏该视图

或者只是获取我的parentView的id并将其设置为禁用?但是,我将无法使背景变暗,就像视图/活动/片段上出现对话框时发生的情况一样。对吧?

我只想知道在progressbar可见时,如何禁止用户进行任何交互


感谢使用文档默认方法progressbar.setCancelable(false)

你的问题:当ProgressBar在android中可见时,如何禁用用户交互

要禁用用户交互,只需添加以下代码

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
要恢复用户交互,只需添加以下代码

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
                    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
这里有一个例子: 注意:我只举一个例子来说明如何禁用或保留用户交互

在xml中添加一个进度条

<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/progressBar"
    android:visibility="gone"/>
  @Override
public void onBackPressed() {
    super.onBackPressed();
    mProgressBar.setVisibility(View.GONE);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
}
当用户按下后退键时,您会再次移除progressbar并保留用户交互

<ProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/progressBar"
    android:visibility="gone"/>
  @Override
public void onBackPressed() {
    super.onBackPressed();
    mProgressBar.setVisibility(View.GONE);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
}
如果要添加禁用和灰显显示功能,则需要在xml布局文件中添加填充父级的线性布局。将其背景设置为#b000000,将其
可视性设置为
已消失
。然后通过编程将其
可见性
设置为
可见

希望这有帮助

刚刚设置:

android:clickable="true" 
在xml中

<ProgressBar...

我通过将根布局添加到
ProgressBar
中,解决了这个问题

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:clickable="true"
    android:gravity="center"
    android:visibility="gone"
    android:id="@+id/progress">
    <ProgressBar
        style="?android:attr/progressBarStyleLarge"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:indeterminate="true"
        android:indeterminateTintMode="src_atop"
        android:indeterminateTint="@color/primary"/>
</LinearLayout>
注意:在我的主视图中,我将
RelativeLayout
作为根目录,并在根目录布局的最后一个位置(最后一个子目录)添加了上述代码


希望这有帮助

制作一个背景透明的对话框。
getWindow().setFlags(WindowManager.LayoutParams.FLAG)不可触摸的问题,
WindowManager.LayoutParams.FLAG(不可触摸)是指当应用程序进入后台并返回时,用户将能够与UI组件进行交互,这需要更多的处理。因此,为了阻止UI,请创建一个透明的对话框,如果您想设置隐藏/显示的时间。在可运行线程中执行此操作。因此,解决方案将是

public class TransparentDialogHelper {

    private Dialog overlayDialog;

    @Inject
    public TransparentDialogHelper() {

    }

    public void showDialog(Context context) {
        if (AcmaUtility.isContextFinishing(context)) {
            return;
        }
        if (overlayDialog == null) {
            overlayDialog = new Dialog(context, android.R.style.Theme_Panel);
            overlayDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED);
        }
        overlayDialog.show();
    }

    public void hideDialog() {
        if (overlayDialog == null || AcmaUtility.isContextFinishing(overlayDialog.getContext())) {
            return;
        }
        overlayDialog.cancel();
    }
}

-------- Timer

Handler handler = new Handler();
handler.postDelayed( () -> {
    view.hideProgress();
}, 2000);

将父布局设置为相对布局并添加以下内容:

    <RelativeLayout ... >

    <other layout elements over which prog bar will appear>

<RelativeLayout android:id="@+id/rl_progress_bar"
                android:layout_width="match_parent" android:clickable="true"
                android:layout_height="match_parent" >
<ProgressBar android:id="@+id/pb"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_centerInParent="true"
             android:indeterminateOnly="true"
             style="@android:style/Widget.DeviceDefault.ProgressBar"
             android:theme="@style/AppTheme.MyProgressBar"
    />
</RelativeLayout>
将(双关语)扩展到:

使用kotlin时,可以使用扩展函数。这样,您就有了一种快速、美观的方法来阻止和取消阻止UI

fun AppCompatActivity.blockInput() {
    window.setFlags(
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
}

fun AppCompatActivity.unblockInput() {
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE)
}

fun AppCompatActivity.blockInputForTask(task: () -> Unit) {
    blockInput()
    task.invoke()
    unblockInput()
}
您可以在活动中使用阻止和取消阻止功能。此外,您还可以添加更多功能,如显示祝酒词或其他内容

在自定义视图或任何其他视图中使用它时,只需将上下文强制转换为活动并使用函数即可

使用
blockInputForTask
围绕简单的线性任务,以及
blockInput
unblockInput
在不同范围内需要它们时

您可以像这样使用
blockInputForTask

blockInputForTask { 
    // Your lines of code
    // Can be multiple lines
}

但是它会对用户交互产生什么影响呢?当进度条可见且可取消设置为false时,我仍然可以触摸或键入EditText。从进度条开始设置可取消(false)开始属性?当您的任务以父视图的形式运行setenabled false,并且在任务完成后setenabled设置为True时,您有选项@txteclipse的可能副本我不想自定义进度条,我已经这样做了。所以,我的问题不是重复的。我只想在进度条可见时禁用用户交互,就像ProgressDialog可见时,用户无法在不关闭进度对话框的情况下与其他UI控件交互一样。现在,我的问题是如何重复这个问题的。我的问题甚至与定制无关。如果你想要一个对话框的所有功能,你应该使用一个对话框。模态的实现非常简单:例如,接受的答案不会阻止键盘交互。链接问题中的第二个答案演示了如何在ProgressDialog中使用自定义ProgressBar资源。如果这不能满足您的需要,您可以在ProgressBar中使用。我正在为极地手表开发一个可穿戴应用程序,这个解决方案给我带来了一些麻烦。我注意到,每当用户快速触摸屏幕时,如果触摸后的动作出于某种原因阻止了使用您的解决方案(以防止多个事件)的UI,android会打开我应用程序后面的任何应用程序或选项。为了更好地解释这一点,它就像我的应用程序一样,可以快速地将时间缩短到几分之一秒,并允许我触摸屏幕上的任何东西。有人经历过类似的事情吗?我建议使用
FrameLayout
而不是
LinearLayout
,除此之外,这个答案是完美的,而且非常有效。谢谢,当背景视图中有按钮时,这是否起作用?这些布局的标高似乎更高(至少api 21+),并且可以单击,除非在此根布局中设置更高的标高。出色的解决方案是,保持对流程的明确控制。哦,是的,它也很好用。赞成票:)