2012-08-10 22 views
0

Android SDK中是否有方法允許我在後臺執行任務時禁用所有UI元素,例如ButtonsMenuItems在後臺工作時禁用所有UI元素

我目前在互聯網上做了一些工作,並顯示ProgressBar通知用戶有關當前的進展。

我應該建立一個List<>我所有的ButtonsMenuItems並通過setEnabled方法開始和後臺任務結束時更新自己的狀態呢?

回答

2

有沒有在Android SDK,讓我當我執行 後臺任務禁用所有 UI的元素,如按鈕和一個的MenuItems方法?

我不記得SDK中存在這種方法。

如果我只是通過 setEnabled方法建立我的所有按鈕和的MenuItems和 更新他們的狀態在後臺任務的開始和結束的名單<>?

我的建議是使用ProgressDialog,代替目前的方法(該對話框也將阻止用戶與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中的菜單項。當工作完成時記得要恢復標誌,以便啓用菜單。

+0

謝謝您的詳細解答。你有關使用對話框的論點是有道理的。我會看到更好,更清晰的用戶。目標是讓應用程序刷新服務器中的數據,類似於GMail App中的按鈕。但是,我想阻止用戶做任何事情,但* *目前的狀態。 – mercutio 2012-08-10 11:29:38

+0

@mercutio我不熟悉GMail應用程序。您可以禁用視圖,或者另一種選擇是使用疊加層(例如,一個'FrameLayout',背景爲透明淺灰色,因此用戶可以看到UI被覆蓋但仍然能夠透視(您會必須吸收觸摸事件在這個級別)),將覆蓋活動,並將包含'ProgressBar'(這可以工作得很好/取決於你當前的佈局)。 – Luksprog 2012-08-10 11:42:35

+0

謝謝,我會嘗試您所描述的多種解決方案,並查看哪些解決方案具有最佳效果。 – mercutio 2012-08-10 11:52:17