2016-07-04 3 views
2

私のカスタムダイアログビルダは、Asynctasks、Webサービスメッセージ、UI入力エラー、またはアクティビティコンテキストを持たないサービス。私は常にApplicationクラスにcurrentActivityというアクティビティを作成していました。その後、すべての活動の再開時に彼らはcurrentActivityに座っています。私のアプリケーションでグローバルダイアログのベストプラクティスは何ですか

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

ダイアログを作成する場合は、そのコンテキストを使用しました。しかし私には1つの問題がありました。たとえば、私はRegisterActivityを開いてからcurrentActivityを変更しました。アプリケーションの背景やいくつかの他のアクティビティが開かれた場合、私のアプリはそのコンテキストでダイアログを作成するとクラッシュします。だから魔女活動を扱うのはです。私はグーグルで、一部の人がレイアウト以外のアクティビティにCustomDialogを埋め込み、そのアクティビティを開くことがわかりました。それは良い解決策ではないようです。 UPDATED

は、例えば、私はすべての送信のSMSを扱うSMSManagerクラスを持っています。私は、ユーザーにダイアログを開き、SMSを送信する前にいくつかのカスタムオプションを選択したいと思っています。

私のアプリケーション全体で、グローバルダイアログのベストプラクティスは何ですか?

答えて

4

まず - への参照を保存するために非常に悪い習慣ですアクティビティ(一般にContext)。 Androidは、ダイアログを作成するために使用できるContextオブジェクトへの参照を常に提供します。 getContext()からActivityではFragmentにあなたがViewで、getActivity()またはgetContext()Contextにアクセスすることができ、オブジェクト自体(this)です。

カスタムクラスのダイアログを表示する必要があり、Contextへの参照がないことを確認した場合は、上記の方法を使用してクラスにContextの参照を提供してください。

Serviceからのダイアログを表示しないでください。ダイアログが表示される前に、アプリケーションがフォアグラウンドで表示されていることを確認してください。イベントバス(LocalBroadcastManager)を使用して、現在表示されているActivityまたはFragmentに状態(エラー、メッセージなど)を送信できます。この場合の「現在表示されているアクティビティまたはフラグメント」は、この種のイベントをリスンしているActivityまたはFragmentです。 onStart()でリスニングを開始し、onStop()の方法をご利用のActivityまたはFragmentに停止してください。ダイアログを表示するために実行中のアクティビティに頼りたくなく、次回ユーザがアプリを起動するのを待たずにいる場合は、ダイアログの代わりにnotificationsを使用することをお勧めします。私の問題がある

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

:(Fragment中)

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; } } 

を使用例:

は、あなたがこのようにヘルパーダイアログビルダークラスを使用して欲しいwhereever Contextカスタムダイアログを作成することができますを考えますカスタムDialog Builderでは使用できません。それは約コンテキスト – Kenji

+0

あなたが断片でダイアログを使用したい場合は、getApplicationContext()を使用し、アクティビティでgetApplicationContext()を送信します。 文脈を持たない条件を詳しく教えてください。だから私はあなたを案内します –

関連する問題