2012-12-19 69 views
8

我正在使用DialogFragment在onCreateDialog()中返回DatePickerDialog。我已經將dateSetListener設置爲DialogFragment(下例中的「this」),除了onDateSet()在發生屏幕旋轉時被調用,這是不可取的。如何讓onDateSet在屏幕旋轉時不被調用?DatePickerDialog onDateSet旋轉時調用

我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(); 
    } 

} 

這是我怎麼稱呼它

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

看一看[setRetainInstance()](http://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean) – Dmide

+0

我是正確的?你不想回顧** dateset **方法當屏幕旋轉 –

+0

由於發佈在這個問題上的賞金,我發現它是一個http://stackoverflow.com/questions/11444238/jelly-bean- datepickerdialog-is-there-a-way-to-cancel但我不能投票結束,因爲我的賞金。 –

回答

-1

當屏幕旋轉時,活動被破壞並重新創建,這將創建一個新的片段,每次。避免此問題的一種方法是更改​​if(getActivity()!= null)語句在您的代碼中的位置。將其放置在不受活動重新創建影響的位置(不在OnCreate方法中)。

9

onDateSet方法中,檢查Activity是否由於配置更改而使用Activity::isChangingConfigurations重新啓動。如果是,則不要顯示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(); 
    } 
} 

我已經測試過並且完美地工作。讓我知道是否需要進一步的幫助。

+1

這隻會在配置更改時起作用,但當用戶通過後退鍵關閉DatePickerDialog時,onDateSet也會被調用。 – Libin

3

您可以嘗試在對話框的附加/分離回調中使用標誌。這個想法是在對話框還沒有附加到窗口時取消對監聽器的任何觸發(所以這種改變不可能來自用戶)就像恢復一樣(我認爲這是再次調用監聽器的原因):

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

和在聽者使用標誌(由於聽者正在構造僅初始化):

@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

嘗試更換線

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

通過

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

方式DatePickerDialog實現,它將通知onStopDataSet改變,如果OnDateSetListener註冊。

你也可以看到onDateSet時,當DatePickerDialog所示(不僅是方向)

原因,當您創建的實例DatePickerDialog按下返回鍵調用,您已註冊的回調監聽。

所以最好的方法是創建一個custom Dialog延伸DatePickerDialog和覆蓋onStop

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

最後,改變CreateDialog

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

這應該完美地工作。如果您發現任何問題,請告知我。

0

這個屬性添加到您的活動清單

android:configChanges="keyboardHidden|orientation"