2014-02-05 35 views
1

我有一個已經實現onCancel方法的進度對話框,因爲我想在用戶按下後退鍵時取消它,但問題是當用戶按下屏幕時,對話框被取消,onCancel方法被調用。當用戶按下屏幕時會調用Dialog onCancel方法

我該如何避免這種情況?

這是代碼:

public void showProgressDialog(Context ctx, String text_connecting) { 
    if (this.progress == null) { 
     this.progress = ProgressDialog.show(ctx, "", text_connecting, true, 
       true); 
     this.progress.setOnCancelListener(new OnCancelListener() { 
      public void onCancel(DialogInterface dialog) { 
       hideProgressDialog(); 
      } 
     }); 
    } 
    this.progress.show(); 
} 
+0

您必須檢查是否當前顯示的進度對話框(在一個線程),如果顯示的軌道運動事件中創建線程。如果在顯示設置取消時運動事件關閉 - 可以爲假。如果您想擺脫持續輪詢並保持CPU繁忙,您還可以使用本地廣播。 – Skynet

+0

另一個解決方案是重寫onBackPress。將對話框設置爲不可取消,然後按取消。這樣你的對話不會在觸摸事件中被取消。多數民衆贊成在這種情況下,這是正確的! – Skynet

回答

0

您必須檢查是否當前顯示的進度對話框(在一個線程),如果顯示的軌道運動事件中創建線程。如果在顯示設置取消時運動事件關閉 - 可以爲假。如果您想擺脫持續輪詢並保持CPU繁忙,您還可以使用本地廣播。

喜歡的東西:

@Override 
     public void run() { 


      if(progress.isShowing() &&(checkTheVariableYouSetInMotionEventDownHere){ 
        progress.setCancellable(false); 
         } 
     } 
    }; 

它只是一個小黑客,可以提高上述邏輯更使它傻瓜證明。

第二種方法是檢查運動事件本身,並在那裏設置可取消假。

+0

wtf,謝謝,但我只想顯示一個簡單的可取消對話框 – NullPointerException

+0

另一個解決方案是覆蓋你的onBackPress。將對話框設置爲不可取消,然後按取消。這樣你的對話不會在觸摸事件中被取消。多數民衆贊成在這種情況下,這是正確的! – Skynet

+0

可能是我誤解了你的問題,如果你將對話框設置爲Dialog.cancelable(false),它將不會取消,除非你直接調用dialog.dismiss()。 – Skynet

0

好了,我終於解決它幹嘛這樣insted的以前的代碼對我的問題

public boolean onKey(DialogInterface arg0, int arg1, KeyEvent arg2) { 
        if (arg1 == KeyEvent.KEYCODE_BACK) { 
         hideProgressDialog(); 
        } 
        return true; 
       } 
0

你可以做

this.progress.setCanceledOnTouchOutside(false); 

這將防止ProgressDialog從任何隨機的觸摸被關閉屏幕。後退按鈕仍然會取消它。

0

使用此代碼爲參考看看這個link

this.progress.setCanceledOnTouchOutside(false); 
相關問題