2012-12-19 22 views
8

Używam funkcji DialogFragment, aby zwrócić obiekt DatePickerDialog w onCreateDialog(). Ustawiłem dateSetListener na DialogFragment ("to" w przykładzie poniżej) i wszystko działa z wyjątkiem tego, że onDateSet() jest wywoływany, gdy występuje rotacja ekranu, co jest niepożądane. Jak mogę uzyskać dostęp do programu DateSet, aby nie dzwonić po obróceniu ekranu?DatePickerDialog onDateSet wywołany po obróceniu

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

} 

I to jest jak ja to nazywam

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

Zapraszamy do obejrzenia [setRetainInstance()] (http://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean) – Dmide

+0

mam rację ? nie chcesz przywołać w trybie ** daty ** podczas obracania ekranu –

+0

Od momentu zaksięgowania nagrody za to pytanie odkryłem, że jest to duplikat http://stackoverflow.com/questions/11444238/jelly-bean- datepickerdialog-is-there-a-way-to-cancel, ale nie mogę głosować, aby zamknąć to ze względu na moją nagrodę. –

Odpowiedz

-1

Gdy ekran jest obrócony aktywność jest zniszczony i ponownie, to tworzy nowy fragment za każdym razem . Jednym ze sposobów na uniknięcie tego problemu byłoby zmiana położenia instrukcji if (getActivity()! = Null) w kodzie. Umieść go w miejscu, na które nie ma wpływu aktywność rekreacyjna (nie w metodzie OnCreate).

9

W metodzie onDateSet należy sprawdzić, czy restartuje się Activity z powodu zmiany konfiguracji za pomocą Activity::isChangingConfigurations. Jeśli tak, nie wyświetlaj numeru 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(); 
    } 
} 

Przetestowałem to i działa idealnie. Daj mi znać, jeśli wymagana jest dalsza pomoc.

+1

To będzie działać tylko podczas zmiany konfiguracji, ale 'onDateSet' będzie również wywoływany, gdy użytkownik odrzuci' DatePickerDialog' klawiszem wstecz. – Libin

3

Możesz spróbować użyć flagi w połączonych/odłączonych oddzwonieniach w oknie dialogowym. Chodzi o to, aby anulować wszelkie wyzwalanie słuchacza, gdy okno dialogowe nie jest jeszcze dołączone do okna (więc zmiana nie może pochodzić od użytkownika) jak przywrócenie (co, jak sądzę, jest powodem ponownego wywoływania słuchacza):

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

i użyć flagi w słuchacza (ze względu na słuchacza inicjowany tylko w konstruktorze):

@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

Spróbuj zamienić linię

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

przez

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

Sposób DatePickerDialog jest realizowany, że będzie on zawiadomić DataSet Zmiana w onStop jeśli OnDateSetListener jest zarejestrowany.

Można również zobaczyć onDateSet nazwie gdy zostanie naciśnięty klawisz Back gdy DatePickerDialog jest pokazane (nie tylko orientację)

powodu podczas tworzenia instancji DatePickerDialog, zarejestrowałeś słuchacza oddzwonienia.

więc najlepszym sposobem jest stworzenie custom Dialog która rozciąga DatePickerDialog i zastąpić onStop

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

Wreszcie zmienić CreateDialog do

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

ta powinna działa idealnie. Daj mi znać, jeśli widzisz jakiś problem.

0

dodać tę właściwość do swojej aktywności w jawnym

android:configChanges="keyboardHidden|orientation" 
Powiązane problemy