0

ButtonsAndroid SDK 中是否有一种方法允许我禁用所有 UI 元素,例如MenuItems在后台执行任务时?

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

我是否应该通过该方法在后台任务的开始和结束时构建List<>我所有的Buttonsand并更新它们的状态?MenuItemssetEnabled

4

1 回答 1

2

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

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

我是否应该只构建一个 List<> 的所有按钮和 MenuItems 并通过 setEnabled 方法在后台任务的开始和结束时更新它们的状态?

我的建议是使用 aProgressDialog而不是您当前的方法(对话框还将阻止用户与 UI 交互,您只需禁用菜单)。如果您启动后台工作人员并禁用所有 UI 视图,用户将看到正在完成一些工作,并且他/她无法使用该应用程序。对我来说,这似乎令人困惑,而且Dialog似乎是一个更好的解决方案,因为它清楚地表明用户必须等到工作完成。另一种选择是将其放置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);
        }
    }
}

传递系统的内容面板 ( 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。工作完成后,请记住恢复标志,以便启用菜单。

于 2012-08-10T06:38:28.540 回答