2012-12-19 23 views
8

Tôi đang sử dụng DialogFragment để trả về DatePickerDialog trong onCreateDialog(). Tôi đã đặt dateSetListener là DialogFragment ("this" trong ví dụ dưới đây) và mọi thứ hoạt động ngoại trừ onDateSet() được gọi khi xoay màn hình xảy ra, điều không mong muốn. Làm thế nào tôi có thể nhận được onDateSet để không được gọi khi màn hình được xoay?DatePickerDialog onDateSet được gọi khi xoay

My DialogFragment

public static class DateDialogFragment extends DialogFragment implements 
DatePickerDialog.OnDateSetListener{ 

    public static DateDialogFragment newInstance() { 
     return new DateDialogFragment(); 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new DatePickerDialog(getActivity(), this, 2012, 11, 19); 
    } 

    @Override 
    public void onDateSet(DatePicker view, int year, int monthOfYear, 
     int dayOfMonth) { 
     //This is called when screen rotated, which I dont want 
     Toast.makeText(getActivity(), "Year: "+year+" Month: "+monthOfYear+" Day: "+dayOfMonth, Toast.LENGTH_SHORT).show(); 
    } 

} 

Và đây là cách tôi gọi nó là

if(getActivity()!=null){ 
    FragmentManager fm = getActivity().getSupportFragmentManager(); 
    DialogFragment newFragment = DateDialogFragment.newInstance(); 
    newFragment.show(fm, "dialog"); 
} 
+0

Có một cái nhìn tại [setRetainInstance()] (http://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean) – Dmide

+0

là tôi sửa ? bạn không muốn gọi lại phương thức ** dateet ** khi màn hình xoay –

+0

Vì đăng một tiền thưởng cho câu hỏi này, tôi đã phát hiện ra rằng đó là bản sao của http://stackoverflow.com/questions/11444238/jelly-bean- datepickerdialog-là-có-một-cách-to-hủy bỏ nhưng tôi không thể bỏ phiếu để đóng nó vì tiền thưởng của tôi. –

Trả lời

-1

Khi màn hình được xoay các hoạt động bị phá hủy và tái tạo, điều này tạo ra một đoạn mới mỗi lần . Một cách để tránh vấn đề này là thay đổi vị trí của câu lệnh if (getActivity()! = Null) trong mã của bạn. Đặt nó ở đâu đó không bị ảnh hưởng bởi hoạt động giải trí (không phải trong phương thức OnCreate).

9

Trong phương pháp onDateSet, kiểm tra xem Activity đang được khởi động lại do thay đổi cấu hình bằng cách sử dụng Activity::isChangingConfigurations. Nếu có, thì không hiển thị Toast.

@Override 
public void onDateSet(android.widget.DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
    if(! this.getActivity().isChangingConfigurations()) { 
     // Dialog is dismissed by user explicitly, hence show the Toast message.  
     Toast.makeText(getActivity(), "Year: "+year+" Month: "+monthOfYear+" Day: "+dayOfMonth, Toast.LENGTH_SHORT).show(); 
    } 
} 

Tôi đã thử nghiệm và hoạt động hoàn hảo. Hãy cho tôi biết nếu cần thêm trợ giúp.

+1

Điều này sẽ chỉ hoạt động trong thay đổi cấu hình, nhưng 'onDateSet' cũng sẽ được gọi khi người dùng loại bỏ' DatePickerDialog' bằng phím quay lại. – Libin

3

Bạn có thể thử sử dụng cờ trong các lần gọi lại/tách rời của hộp thoại. Ý tưởng là để hủy bỏ bất kỳ kích hoạt của người nghe trong khi hộp thoại chưa được gắn vào cửa sổ (vì vậy thay đổi không thể đến từ người dùng) như khôi phục (mà tôi nghĩ là lý do cho người nghe được gọi lại):

// a field in the DateDialogFragment 
private boolean mShouldBeCanceled = true; // cancel the listener when this is true(the default) 

//... 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    return new DatePickerDialog(getActivity(), this, 2012, 11, 19) { 

       @Override 
       public void onAttachedToWindow() { 
        mShouldBeCanceled = false; 
       } 

       @Override 
       public void onDetachedFromWindow() { 
        mShouldBeCanceled = true; 
       } 
    }; 
} 

và sử dụng cờ trong người nghe (do người nghe được chỉ khởi tạo trong constructor):

@Override 
public void onDateSet(DatePicker view, int year, int monthOfYear, 
    int dayOfMonth) { 
    if (mShouldBeCanceled) { 
      return; // not a valid listener triggering 
    } 
    //This is called when screen rotated, which I dont want 
    Toast.makeText(getActivity(), "Year: "+year+" Month: "+monthOfYear+" Day: "+dayOfMonth, Toast.LENGTH_SHORT).show(); 
} 
1

Cố gắng thay thế dòng

@Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new DatePickerDialog(getActivity(), this, 2012, 11, 19); 
    } 

bởi

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    super.onCreateDialog(savedInstanceState); 
} 
2

Cách DatePickerDialog được thực hiện rằng nó sẽ thông báo cho DataSet Thay đổi trong onStop nếu OnDateSetListener được đăng ký.

Bạn cũng có thể nhìn thấy onDateSet gọi khi lại chính là ép khi DatePickerDialog được hiển thị (không chỉ định hướng)

Lý do, khi bạn tạo ra thể hiện DatePickerDialog, bạn đã đăng ký người nghe gọi lại.

Vì vậy, cách tốt nhất là để tạo ra một custom Dialog kéo dài DatePickerDialog và ghi đè lên onStop

Tuỳ chỉnh DatePickerDialog

private static class CustomDatePickerDialog extends DatePickerDialog{ 

    public CustomDatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) { 
     super(context, callBack, year, monthOfYear, dayOfMonth); 
    } 

    @Override 
    protected void onStop() { 
     return; 
    } 
} 

Cuối cùng, thay đổi CreateDialog để

@Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     return new CustomDatePickerDialog(getActivity(), this, 2012, 11, 19); 
    } 

sự nên này làm việc hoàn hảo. Hãy cho tôi biết nếu bạn thấy bất kỳ vấn đề nào.

0

thêm khách sạn này đến hoạt động của bạn trong manifest

android:configChanges="keyboardHidden|orientation" 
Các vấn đề liên quan