2013-08-18 77 views
0

我有一個活動,用戶可以輸入主機名,用戶名和密碼,然後單擊「驗證憑據」按鈕。然後憑證將被檢查,這將需要一些時間。同時,用戶不應該能夠更改憑證,也不能再次單擊「驗證」。所以,像ProgressDialog這樣的模態對話框對於這一點來說似乎非常完美。「登錄」活動:ProgressDialog替代

不幸的是,ProgressDialog在定向更改等方面有衆所周知的侷限性。指南(UI/Dialogs)告訴您完全避免ProgressDialog,並在佈局中使用ProgressBar(如Progress & Activity)。這是什麼意思?我應該只用一個進度條創建另一個活動嗎?或者禁用所有輸入字段並在其上放置進度條?聽起來很奇怪...你最喜歡的解決方案是什麼?我用

+0

只是一個小小的建議,如果你不知道,如果你的佈局不是太複雜,你可以多次使用'setContentView'。 –

回答

3

最好的事情是:

放一個ProgressBar只是登錄Button旁邊。

我在OnCreate方法中在其旁邊放置了一個進度條(其可見性設置爲View.GONE)。

當用戶點擊登錄/提交按鈕時,我將按鈕的可見性設置爲View.GONE,並將ProgressBar的可見性設置爲View.VISIBLE

它看起來不錯,直到工作完成後,用戶不能點擊按鈕,如果發生錯誤,切換的知名度,讓用戶再試

+0

你的回答很好,但是當方向改變時,所有的組件都會處於初始狀態。 –

+0

嗯......那麼最好把OnResume的代碼放在OnResume中 –

+0

onResume將在第一次onCreate之前調用,那時在onCreate中完成的所有初始化都將爲null。所以它會產生一個NPE(空指針異常) –

-1

對於暫時解決您的問題,您可以繼續使用Progress Dialog並把這個線你Login Activity's標籤在Manifest.xml文件:

android:configChanges="orientation|keyboardHidden|screenSize" 

使用此行代碼不會影響方向變化Progress Dialog。但根據Android Development的文檔,這被認爲是錯誤的做法。

從長遠來看,我建議您保留方向更改的狀態。

+0

謝謝,我已經找到了如何使用ProgressDialog的方法。但是我想知道*禁用用戶輸入的時候*用於顯示進度的Android 4+方式? – junique

+0

您應該恢復並保存處理方向更改的狀態,並使用進度對話框讓用戶知道該活動正在進行一些重要處理:] –

+0

我可以知道對我的答案進行投票的原因嗎? –

1

像@ micro.pravi在他的answer中提到的那樣,您可以在佈局中實現ProgressBar。爲了保持狀態,你必須使用onSaveInstanceStateonRestoreInstanceState來保存和恢復重要的價值觀,即私有變量的方向改變後,像private boolean isChecking

public class MyActivity extends Activity { 
    public boolean isProcessing; 

    @Override 
    public void onCreate(Bundle stateBundle) { 
     super.onCreate(stateBundle); 
     // Set Layout 
     setContentView(R.layout.main); 

     if(stateBundle!=null) { 
      // read your data here from the bundle 
      isProcessing = stateBundle.getBoolean("isProcessing"); 
     } 

     setUiState(isChecking); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle stateBundle) { 
     // Second value of getBoolean is the default value 
     isProcessing = stateBundle.getBoolean("isProcessing", false); 
     super.onRestoreInstanceState(stateBundle); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle stateBundle) { 
     // Save the critical data 
     stateBundle.putString("isProcessing", isProcessing); 
     super.onSaveInstanceState(stateBundle); 
    } 
    @Override 
    protected onResume() { 
     setUiState(isProcessing); 
    } 
    private setUiState(boolean processing) { 
     textView.setEnabled(!processing); 
     button.setEnabled(!processing); 
     progressbar.setVisibility(processing?View.VISIBLE:View.GONE); 
    } 
} 

這應該被用來保存任何關鍵數據上的方向變化或者當該應用程序正在被殺害,隨後由操作系統恢復。您不必保存您的TextView數據,因爲Defautl View元素已經自己處理這些數據。也不要以這種方式存儲圖像數據。而是將Uri或路徑存儲到Url並加載到恢復區