2016-07-04 4 views
2

다음과 같은 많은 이벤트에서 트리거되는 내 맞춤 대화 상자 빌더가 있습니다 : Asynctasks, 웹 서비스 메시지, UI 입력 오류 또는 활동 컨텍스트가없는 서비스 . 항상 Application 클래스에 currentActivity이라는 액티비티를 만들었습니다. 그때 모든 활동의 이력서에 앉아서 currentActivity에 앉는다.내 애플리케이션에서 글로벌 다이얼로그의 우수 사례는 무엇입니까

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

그런 다음 대화 상자를 만든 경우 해당 컨텍스트를 사용했습니다. 하지만 한 가지 문제가있었습니다. 예를 들어 RegisterActivity를 연 다음 currentActivity을 변경했습니다. 그때 애플 리케이션 고토 배경 또는 일부 다른 활동이 열리는 경우, 내 애플 리케이션은 그 컨텍스트와 대화를 만드는 충돌합니다. 그래서 취급 마녀 활동은 currentActivity입니다. 내가 봤 거든 일부 사람이 아닌 레이아웃 activty에 CustomDialog를 포함하고 그 활동을 엽니 다 찾습니다. 하지만 좋은 해결책이 아닌 것 같습니다. 업데이트]

예를 들어 나는 나의 모든 보내는 SMS를 처리 SMSManager 클래스가 있습니다. 나는 사용자에게 sms를 보내기 전에 사용자 정의 옵션을 선택한 대화 상자를 열고 싶다.

전체 응용 프로그램에서 글로벌 다이얼로그의 모범 사례는 무엇입니까?

답변

4

첫 번째는 -에 대한 참조를 저장하는 아주 나쁜 방법입니다 활동 (일반적으로 Context). Android는 항상 대화 상자를 만드는 데 사용할 수있는 Context 객체에 대한 참조를 제공합니다. Activity의 경우 객체 자체 (this)이고 Fragment의 경우 getActivity() 또는 getContext(), View-getContext()으로 Context에 액세스 할 수 있습니다.

사용자 지정 클래스의 대화 상자를 표시해야하고 Context에 대한 참조가없는 경우 위의 방법을 사용하여 클래스에 Context 참조를 제공해야합니다.

Service의 대화 상자를 표시하지 마십시오. 대화 상자를 표시하기 전에 앱이 포 그라운드로 표시되어 있는지 확인하십시오. 이벤트 버스 (또는 LocalBroadcastManager)를 사용하여 상태 (오류, 메시지 또는 기타)를 현재 표시되는 Activity 또는 Fragment으로 보낼 수 있습니다. 이 경우 "현재 표시되는 활동 또는 단편"은 이러한 종류의 이벤트를 수신하는 Activity 또는 Fragment입니다. onStart()에서 듣기를 시작하고 onStop() 방법을 Activity 또는 Fragment 중에서 듣지 마세요. 대화 상자를 표시하기 위해 실행중인 활동에 의존하지 않고 사용자가 다음에 응용 프로그램을 시작할 때까지 기다리지 않으려면 대화 상자 대신 notifications을 사용하는 것이 좋습니다.

A는이 같은 도우미 대화 빌더 클래스를 사용하여 원하는 whereever 당신이 사용자 정의 대화 상자를 만들 수 있습니다 Context 감안할 때 : (A 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; 
    } 
} 

사용 예를 :

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 관리자 클래스 또는 웹 서비스 클래스의 대화 상자를 표시하고 싶습니다. 그래서 그들의 컨텍스트와 대화 상자를 열 수 없습니다. – 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

내 문제가 사용자 정의 대화 상자 빌더가 아닙니다. 컨텍스트에 대한 것입니다 – Kenji

+0

조각에서 대화 상자를 사용하려면 getActivity(). getApplicationContext()를 사용하고 activity에서 getApplicationContext()를 보내십시오. 컨텍스트가없는 조건을 자세히 설명하십시오 .. 그래서 내가 안내 할 것입니다 –