40

Tôi có một Phân đoạn có thể tạo và bật lên Hộp thoại, nhưng khi tôi nhấn nút quay lại, nó loại bỏ hộp thoại mặc dù tôi gọi rõ ràng setCancelable (sai); Có cách nào để DialogFragment của tôi không nhạy cảm với nút quay lại không?Android: Cách ngăn nút quay lại hủy một FragmentDialog

public class LoadingDialogFragment extends DialogFragment 
{ 
    String title; 
    String msg; 

    public LoadingDialogFragment() 
    { 
     this.title = "Loading..."; 
     this.msg = "Please wait..."; 
    } 
    public LoadingDialogFragment(String title, String msg) 
    { 
     this.title = title; 
     this.msg = msg; 
    } 

    @Override 
    public Dialog onCreateDialog(final Bundle savedInstanceState) 
    { 
     final ProgressDialog dialog = new ProgressDialog(getActivity()); 

     dialog.setTitle(title); 
     dialog.setMessage(msg); 
     dialog.setIndeterminate(true); 
     dialog.setCanceledOnTouchOutside(false); 
     dialog.setCancelable(false); 

     return dialog; 
    } 

} 

tôi tạo FragmentDialog từ một AsyncTask:

private class GpsTask extends AsyncTask<String, Integer, Integer> 
{ 
    //ProgressDialog dialog; 
    @Override 
    protected void onPreExecute() 
    { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     DialogFragment newFragment = new LoadingDialogFragment("Gathering Location", "Acquiring GPS lock..."); 
     ft.addToBackStack(null); 
     newFragment.show(ft, "dialog"); 
    } 

    @Override 
    protected Integer doInBackground(String... params) 
    { 
     //acquire a GPS lock and grab a few position updates 
    } 

    @Override 
    protected void onProgressUpdate(Integer... input) { } 

    @Override 
    protected void onPostExecute(Integer result) 
    { 
     getSupportFragmentManager().popBackStackImmediate(); 
    } 
} 

Trả lời

94

Làm thế nào về việc sử dụng setCancelable? Bạn đã thử à?

Từ Documents -

Điểu khiển Dialog cho thấy có thể hủy bỏ. Sử dụng điều này thay vì gọi trực tiếp Dialog.setCancelable (boolean), bởi vì DialogFragment nhu cầu để thay đổi hành vi của nó dựa trên này

+29

Điều này đúng! nó chỉ ra rằng bạn phải gọi setCancelable (false) trên DialogFragment, không phải là Dialog bên trong mà nó giữ! – MattF

+1

@MattF Nhận xét này là trình tiết kiệm cuộc sống. Không nhận ra tôi cần gọi 'setCancelable()' trên 'DialogFragment' thay vì' ProgressDialog'. Cảm ơn! – prolink007

4

Tôi không hoàn toàn chắc chắn nếu điều này sẽ làm việc với FragmentDialogs, nhưng nếu setCancelable không hoạt động cho bạn, có thể bạn nên xem bài viết này: Android: Prompt user to save changes when Back button is pressed

Nó giải thích cách phát hiện nút quay lại được nhấn. Vì vậy, có lẽ bạn có thể ngăn chặn các nút bấm và nó sẽ ngăn chặn các hộp thoại từ đóng cửa?

+0

Tôi đã kết thúc với câu trả lời khác nhưng tôi nghĩ rằng điều này hoạt động tốt, cảm ơn rất nhiều – MattF

1

Nó có thể giúp bạn.

newFragment.setCancelable(false); 

thực hiện các thay đổi như trên khi tạo đối tượng DialogFragment hoặc trong hàm tạo của hộp thoại tùy chỉnh như trong ví dụ bên dưới.

public static CustomClearHourDialog newInstance(Bundle args, IDialogListener listener) 
     { 
      CustomClearHourDialog clearHourDialog = new CustomClearHourDialog();    
      CustomClearHourDialog.listener = listener; 
      clearHourDialog.setCancelable(false); 
      return clearHourDialog; 
     }