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

时间:2012-08-10 00:07:25

标签: java android android-button android-menu

Android SDK中是否有方法允许我在后台执行任务时禁用所有UI元素,例如ButtonsMenuItems

我目前在互联网上做一些工作并显示ProgressBar通知用户当前进度。

我应该只构建List<>Buttons的{​​{1}}并通过MenuItems方法在后台任务的开始和结束时更新其状态吗?< / p>

1 个答案:

答案 0 :(得分:2)

  

Android SDK中是否有方法允许我禁用所有方法   我执行任务时的UI元素,如Buttons和MenuItems   背景?

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

  

我应该只构建一个List&lt;&gt;我所有的按钮和MenuItems和   通过在后台任务的开始和结束更新他们的状态   setEnabled方法?

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

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

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);
        }
    }
}

传递系统的内容面板(changeViewsState((ViewGroup) findViewById(android.R.id.content), false);)或活动布局的根目录:

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);

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