2017-09-26 88 views
1

我創建了自定義Progress Dialogue。重寫屬性如setCancelable(),setCanceledOnTouchOutside()不適用於我。Android自定義進度對話框 - setCancelable()

public class CustomProgressDialogue extends ProgressDialog { 

    private final Context context; 

    public CustomProgressDialogue(Context context) { 
     super(context); 
     this.context = context; 
     getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.progress_view); 

    } 

    // Didn't worked 
    @Override 
    public void setCancelable(boolean flag) { 
     super.setCancelable(false); 
    } 
    // Didn't worked 
    @Override 
    public void setCanceledOnTouchOutside(boolean cancel) { 
     super.setCanceledOnTouchOutside(false); 
    } 
} 

但同時在創建實例後應用相同的屬性。

// Worked 
progressDialogue = new CustomProgressDialogue(getContext()); 
     progressDialogue.setCancelable(false); 
     progressDialogue.setCanceledOnTouchOutside(false); 

請問有人能解釋一下嗎?

+1

爲什麼設置「MetricsProgressDialogue」?而不是'CustomProgressDialogue'? –

+0

對不起,這是一個複製粘貼錯誤。立即修改 –

回答

1

,而不是覆蓋可取消的方法創建一個靜態方法,像這樣的,然後傳遞所需的選項

這裏是ProgressDialog類是如何做到這一點:

public static ProgressDialog show(Context context, CharSequence title, 
      CharSequence message, boolean indeterminate, 
      boolean cancelable, OnCancelListener cancelListener) { 
     ProgressDialog dialog = new ProgressDialog(context); 
     dialog.setTitle(title); 
     dialog.setMessage(message); 
     dialog.setIndeterminate(indeterminate); 
     dialog.setCancelable(cancelable); 
     dialog.setOnCancelListener(cancelListener); 
     dialog.show(); 
     return dialog; 
    } 
+1

這是一個很好的問題。現在只有我檢查ProgressDialog Source code.Got it。:) –

1

你可以用這種方式嘗試

public class CustomProgressDialogue extends ProgressDialog 
    { 

     public static ProgressDialog(Context context) { // This section create Main role . 
     CustomProgressDialogue dialog = new CustomProgressDialogue (context); 
     dialog.setCancelable(false); // Add this 
     return dialog; 
     } 

     public CustomProgressDialogue (Context context) { 
     super(context); 
     } 

     public CustomProgressDialogue (Context context, int theme) { 
     super(context, theme); 
     } 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.progress_view); 


     } 

     @Override 
     public void show() { 
     super.show(); 

     } 

     @Override 
     public void dismiss() 
     { 
     super.dismiss(); 

     } 

    } 
+1

那麼,我的解決方案出了什麼問題。是否有任何與上下文相關的問題 –

+0

@DonChakkappan可能是。我不確定 。你可以用這種方式。供參考。 '靜態ProgressDialog'在這裏創建樞軸角色。 –

+1

Umar的答案更適合。所以我會投票給你:) –

0

你卡恩添加

public static ProgressDialog(Context context) { 
     CustomProgressDialogue dialog = new CustomProgressDialogue (context); 
     dialog.setCanceledOnTouchOutside(false); 
     return dialog; 
     } 

我的方法是

final AlertDialog alertD = new AlertDialog.Builder(context).create(); 
    alertD.setCanceledOnTouchOutside(false); 

是工作...!

0

您的代碼的問題在於,您正在覆蓋CustomDialog類中的cancelable和OutsideTouchCancel,但您並未從ProgressDialog類中替換原始代碼。所以當你在你的構造函數中調用super(context)時,它將啓動你的對話框,其構建函數爲Cancelable和OutsideTouchCancel。

所以在你CustomDialog的構造函數,你需要顯式調用

dialog.setCancelable(false); 
dialog.setCanceledOnTouchOutside(false) 

你不需要覆蓋這些功能的自定義類。