Android SDK中是否有方法允許我在後臺執行任務時禁用所有UI元素,例如Buttons
和MenuItems
?在後臺工作時禁用所有UI元素
我目前在互聯網上做了一些工作,並顯示ProgressBar
通知用戶有關當前的進展。
我應該建立一個List<>
我所有的Buttons
和MenuItems
並通過setEnabled
方法開始和後臺任務結束時更新自己的狀態呢?
Android SDK中是否有方法允許我在後臺執行任務時禁用所有UI元素,例如Buttons
和MenuItems
?在後臺工作時禁用所有UI元素
我目前在互聯網上做了一些工作,並顯示ProgressBar
通知用戶有關當前的進展。
我應該建立一個List<>
我所有的Buttons
和MenuItems
並通過setEnabled
方法開始和後臺任務結束時更新自己的狀態呢?
有沒有在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
中的菜單項。當工作完成時記得要恢復標誌,以便啓用菜單。
謝謝您的詳細解答。你有關使用對話框的論點是有道理的。我會看到更好,更清晰的用戶。目標是讓應用程序刷新服務器中的數據,類似於GMail App中的按鈕。但是,我想阻止用戶做任何事情,但* *目前的狀態。 – mercutio 2012-08-10 11:29:38
@mercutio我不熟悉GMail應用程序。您可以禁用視圖,或者另一種選擇是使用疊加層(例如,一個'FrameLayout',背景爲透明淺灰色,因此用戶可以看到UI被覆蓋但仍然能夠透視(您會必須吸收觸摸事件在這個級別)),將覆蓋活動,並將包含'ProgressBar'(這可以工作得很好/取決於你當前的佈局)。 – Luksprog 2012-08-10 11:42:35
謝謝,我會嘗試您所描述的多種解決方案,並查看哪些解決方案具有最佳效果。 – mercutio 2012-08-10 11:52:17