当ProgressBar在android中可见时,如何禁用用户交互?
我正在使用自定义进度条。现在,当任务正在进行时,我将显示进度条,但用户仍然可以与视图和控件交互。 当ProgressDialog可见时,如何像ProgressDialog一样禁用整个视图上的用户交互 我是否需要在主视图顶部使用透明视图,并在该视图上显示进度条,并在任务完成后隐藏该视图 或者只是获取我的parentView的id并将其设置为禁用?但是,我将无法使背景变暗,就像视图/活动/片段上出现对话框时发生的情况一样。对吧? 我只想知道在progressbar可见时,如何禁止用户进行任何交互当ProgressBar在android中可见时,如何禁用用户交互?,android,user-interface,progress-bar,Android,User Interface,Progress Bar,我正在使用自定义进度条。现在,当任务正在进行时,我将显示进度条,但用户仍然可以与视图和控件交互。 当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+),并且可以单击,除非在此根布局中设置更高的标高。出色的解决方案是,保持对流程的明确控制。哦,是的,它也很好用。赞成票:)