Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在后台工作时禁用所有UI元素_Java_Android_Android Button_Android Menu - Fatal编程技术网

Java 在后台工作时禁用所有UI元素

Java 在后台工作时禁用所有UI元素,java,android,android-button,android-menu,Java,Android,Android Button,Android Menu,Android SDK中是否有一种方法允许我在后台执行任务时禁用所有UI元素,如按钮和菜单项 我目前在互联网上做一些工作,并显示一个ProgressBar,告知用户当前的进度 我是否应该为我所有的按钮和菜单项建立一个列表,并通过setEnabled方法更新它们在后台任务开始和结束时的状态 Android SDK中是否有允许我禁用所有功能的方法 在中执行任务时的UI元素,如按钮和菜单项 背景 我不记得SDK中存在这样的方法 我是否应该建立一个包含所有按钮和菜单项的列表 在后台任务开始和结束时,通过

Android SDK中是否有一种方法允许我在后台执行任务时禁用所有UI元素,如
按钮
菜单项

我目前在互联网上做一些工作,并显示一个
ProgressBar
,告知用户当前的进度

我是否应该为我所有的
按钮
菜单项
建立一个
列表
,并通过
setEnabled
方法更新它们在后台任务开始和结束时的状态

Android SDK中是否有允许我禁用所有功能的方法 在中执行任务时的UI元素,如按钮和菜单项 背景

我不记得SDK中存在这样的方法

我是否应该建立一个包含所有按钮和菜单项的列表 在后台任务开始和结束时,通过 设置启用的方法

我的建议是使用
ProgressDialog
而不是当前的方法(该对话框还将阻止用户与UI交互,您只需禁用菜单)。如果启动后台工作程序并禁用所有UI视图,用户将看到有一些工作正在完成,并且他/她无法使用该应用程序。对我来说,这似乎令人困惑,而
对话框
似乎是一个更好的解决方案,因为它清楚地表明用户必须等待工作完成。另一个选项是将
ProgressBar
放置在覆盖活动的覆盖层中,以便用户仍然可以看到下面的UI(如果这是您想要的)

要禁用所有视图,我将使用如下方法:

private void changeViewsState(ViewGroup parent, boolean state) {
    int count = parent.getChildCount();
    for (int i = 0; i < count; i++) {
        View child = parent.getChildAt(i);
        if (child instanceof ViewGroup) {
            changeViewsState((ViewGroup) child, state);
        } else if (child instanceof View) {
            child.setEnabled(state);
        }
    }
}

要禁用菜单项,请在后台工作即将开始时设置布尔标志,并使用该标志启用/禁用回调
onPrepareOptionMenu
中的菜单项。工作完成后,请记住还原标志,以便启用菜单。

谢谢您的详细回答。您关于使用对话框的论点是有道理的。我将看到什么看起来更好,用户更清楚。目标是让应用程序从服务器刷新数据,类似于GMail应用程序中的按钮。但是,我想阻止用户做任何事情,只是查看当前状态。@mercutio我不熟悉GMail应用程序。您可以禁用视图,或者另一个选项是使用覆盖(例如,背景为透明浅灰色的
FrameLayout
,这样用户可以看到UI被覆盖,但仍然可以看到(您必须吸收此级别的触摸事件))这将涵盖活动,并将包含
进度条
(根据您当前的布局,这可能会很好/不好)。谢谢,我将尝试您描述的多种解决方案,看看哪种解决方案效果最好。
ViewGroup root; // root is a reference of the root of your content view
// in the onCreate method

root = (ViewGroup) getLayoutInflater().inflate(R.layout.your_activity_layout_file, null);

// later use it:
changeViewsState(root, false);