2016-07-04 93 views
2

我的應用程序中有我的自定義對話框構建器,它將觸發許多事件,如:Asynctasks,Web服務消息,UI輸入錯誤或來自沒有活動上下文的服務。我經常在我的Application類中創建一個名爲currentActivity的活動。然後在每個活動的簡歷上他們坐在currentActivity我的應用程序中全局對話框的最佳做法是什麼

@Override 
    protected void onResume() { 
     super.onResume(); 
     MyApplication.currentActivity = MainActivity.this; 

然後在創建對話框的情況下,我使用該上下文。但我有一個問題。例如我打開RegisterActivity然後currentActivity改爲它。然後當應用程序轉到背景或某些其他活動打開的情況下,我的應用程序將崩潰創建與該上下文的對話框。所以處理女巫活動是currentActivity是一件令人頭疼的事情。我搜索了一下,發現有些人在非佈局活動中嵌入了CustomDialog,然後打開該活動。但似乎並沒有很好的解決方案。

修訂

比如我有一個處理我的所有發送短信一個SMSManager類。我想打開對話框,用戶在發送短信之前選擇了一些自定義選項。

那麼在我的整個應用程序中,全局對話框的最佳實踐是什麼?

回答

4

首先 - 這是一個非常不好的做法,將其保存到引用活動(或一般Context)。 Android始終爲您提供對可用於創建對話框的Context對象的引用。在Activity它是對象本身(this),在Fragment您可以訪問Context通過getActivity()getContext(),在View - getContext()

如果您需要顯示自定義班級中的對話框,並且沒有參考Context,請確保您使用上述方法爲班級提供Context引用。

不要嘗試顯示Service中的任何對話框 - 在顯示任何對話框之前,確保您的應用程序處於前景和可見狀態。您可以使用事件總線(或LocalBroadcastManager)將狀態(錯誤,消息或其他)發送到當前可見的ActivityFragment。在這種情況下,「當前可見的活動或片段」僅僅是正在監聽這種事件的ActivityFragment。開始收聽onStart()並停止收聽您的ActivityFragmentonStop()方法。如果您不想依賴任何正在運行的活動來顯示對話框,並且不想等待用戶下次啓動應用程序時,我會建議使用notifications而不是對話框。

給出一個Context等。無論您希望使用一個輔助對話框生成器類這樣你就可以創建自定義對話框:

public class DialogBuilder { 
    private String title; 
    private String message; 
    private String primaryButtonTitle; 
    private String secondaryButtonTitle; 
    private Dialog.OnClickListener primaryButtonListener; 
    private Dialog.OnClickListener secondaryButtonListener; 
    private Activity context; 
    private boolean showIcon; 
    private boolean cancellable; 

    public DialogBuilder(Activity context) { 
     this.context = context; 
    } 

    public DialogBuilder setTitle(@StringRes int title) { 
     this.title = context.getString(title); 
     return this; 
    } 

    public DialogBuilder setTitle(String title) { 
     this.title = title; 
     return this; 
    } 

    public DialogBuilder setMessage(@StringRes int message) { 
     this.message = context.getString(message); 
     return this; 
    } 

    public DialogBuilder setMessage(String message) { 
     this.message = message; 
     return this; 
    } 

    public DialogBuilder setShowIcon() { 
     showIcon = true; 
     return this; 
    } 

    public DialogBuilder setPrimaryButton(@StringRes int title, Dialog.OnClickListener listener) { 
     primaryButtonTitle = context.getString(title); 
     primaryButtonListener = listener; 
     return this; 
    } 

    public DialogBuilder setSecondaryButton(@StringRes int title, Dialog.OnClickListener listener) { 
     secondaryButtonTitle = context.getString(title); 
     secondaryButtonListener = listener; 
     return this; 
    } 

    public DialogBuilder setCancellable(boolean cancellable) { 
     this.cancellable = cancellable; 
     return this; 
    } 

    public AlertDialog create() { 
     AlertDialog.Builder builder = new AlertDialog.Builder(context); 
     View dialogView = LayoutInflater.from(context).inflate(R.layout.my_custom_dialog, null);   
     builder.setView(dialogView); 

     // get your custom views here and configure them based on given settings (field values of this class) 

     final AlertDialog dialog = builder.create(); 
     return dialog; 
    } 
} 

例如使用(在Fragment):

new DialogBuilder(getActivity()) 
    .setTitle(R.string.title) 
    .setMessage(R.string.message) 
    .setPrimaryButton(R.string.ok, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // do something 
      dialog.dismiss();   
     } 
    }) 
    .setSecondaryButton(R.string.settings_cancel, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // do something 
      dialog.dismiss();   
     } 
    }).create().show(); 
+0

我知道保持currentActivity並不好,我尋找更好的解決方案。我的自定義對話框生成器與你的非常相似,但它的上下文點。正如我所說的問題,我想從許多類中打開對話框,其中一些沒有任何活動上下文。例如我想從我的SMS管理器類或與應用程序上下文一起使用的Web服務類中顯示對話框。所以我不能用他們的上下文打開對話框。 – Kenji

+0

我更新了我的答案,提示通知 – artkoenig

+0

,所以你說不顯示任何服務的UI對話框,只是播放一些事件並捕獲活動。這聽起來不錯,並與MVC架構相匹配。但如果我的服務想與用戶溝通並提供一些意見呢? – Kenji

-1

創建一個自定義對話框類是這樣的:

public class DialogBoardOut extends Dialog { 

private TextView txtBoardOut; 
private RelativeLayout rel_close_boardout; 

public DialogBoardOut(Context mContext) { 
    super(mContext); 
} 

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

} }

調用,比如:

DialogBoardOut dialogQrCode = new DialogBoardOut(HomeBaseActivity.this); 
      dialogQrCode.requestWindowFeature(Window.FEATURE_NO_TITLE); 
      // dialogQrCode.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 
      dialogQrCode.show(); 
      dialogQrCode.getWindow().setLayout(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT); 
+0

我的問題是而不是使用自定義的Dialog構建器。這是關於上下文 – Kenji

+0

如果你想使用片段中的對話框,然後使用getActivity()。getApplicationContext()和在活動發送getApplicationContext() 請詳細說明你沒有上下文的條件..所以我會指導你 –

相關問題