2014-12-01 3 views
0

Прежде всего, извините за мой английский.Пользовательский DialogPreference исчезает после изменения ориентации

Я пытаюсь создать пользовательский диалог выбора «день» на моем экране предпочтений. Я получил коды с сайта разработчика Android и от Stackoverflow.

Диалог работает «хорошо», он сохраняет и загружает значение (макет содержит NumberPicker и TextView). Проблема заключается в следующем: диалог исчезает при вращении устройства.

Я прочитал несколько сообщений на этом форуме и на других сайтах, но не повезло. Вы можете мне помочь ? Я потратил несколько часов на то, чтобы найти проблему, но я не понимаю, как ее решить. Благодарю.

Код:

package hu.test.android.demo.ui; 

import hu.test.android.demo.AMdtApplication; 
import hu.test.android.demo.R; 
import android.content.Context; 
import android.content.res.TypedArray; 
import android.os.Parcel; 
import android.os.Parcelable; 
import android.preference.DialogPreference; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.NumberPicker; 

public class DayPreference extends DialogPreference { 

private NumberPicker picker = null; 
private static int day; 

public static int getDay() { 
    return day; 
} 

public DayPreference(Context ctxt, AttributeSet attrs) { 
    super(ctxt, attrs); 

    setDialogLayoutResource(R.layout.day_preference); 

    setPositiveButtonText (TestApplication.getContext().getResources().getString(R.string.save)); 
    setNegativeButtonText (TestApplication.getContext().getResources().getString(R.string.cancel)); 
} 

@Override 
protected void onBindDialogView(View v) { 
    super.onBindDialogView (v); 

    picker = (NumberPicker) v.findViewById (R.id.day_preference_number_picker); 

    picker.setMinValue (1); 
    picker.setMaxValue (30); 
    picker.setValue (day); 
} 

@Override 
protected void onDialogClosed(boolean positiveResult) { 
    super.onDialogClosed(positiveResult); 

    if (positiveResult) { 
     if (callChangeListener (day)) { 
      day = picker.getValue(); 
      persistInt (day); 
     } 

     setSummary(getSummary()); 
    } 

} 

@Override 
protected Object onGetDefaultValue(TypedArray a, int index) { 
    return (a.getString(index)); 
} 

@Override 
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { 

    if (restoreValue) { 
     if (defaultValue == null) { 
      day = getPersistedInt (30); 
     } 
     else { 
      day = getPersistedInt ((Integer) defaultValue); 
     } 
    } 
    else { 
     day = (Integer) defaultValue; 
    } 

    setSummary (getSummary()); 
} 

@Override 
public CharSequence getSummary() { 
    return String.valueOf (day) + " " + TestApplication.getContext().getResources().getString(R.string.label_day); 
} 

// state save & restore 
@Override 
protected Parcelable onSaveInstanceState() { 
    final Parcelable superState = super.onSaveInstanceState(); 

    if (isPersistent()) { 
     return superState; 
    } 

    final SavedState myState = new SavedState (superState); 
    myState.value = day; 

    return myState; 
} 

@Override 
protected void onRestoreInstanceState (Parcelable state) { 

    if (state == null || !state.getClass().equals(SavedState.class)) { 
     super.onRestoreInstanceState(state); 

     return; 
    } 

    SavedState myState = (SavedState) state; 
    super.onRestoreInstanceState(myState.getSuperState()); 

    // set the value to the picker 
    picker.setValue (myState.value); 
} 

private static class SavedState extends BaseSavedState { 
    public int value; 

    public SavedState (Parcelable superState) { 
     super(superState); 
    } 

    public SavedState (Parcel source) { 
     super(source); 
     value = source.readInt(); 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     super.writeToParcel(dest, flags); 
     dest.writeInt(value); 
    } 

    // Standard creator object using an instance of this class 
    @SuppressWarnings("unused") 
    public static final Parcelable.Creator <SavedState> CREATOR = new Parcelable.Creator <SavedState>() { 

     public SavedState createFromParcel(Parcel in) { 
      return new SavedState(in); 
     } 

     public SavedState[] newArray (int size) { 
      return new SavedState[size]; 
     } 
    }; 
} 

}

ответ

4

UPDATE:

Пожалуйста, обратите внимание, что ниже решение только быстрый хак (и это не рекомендуемый подход), правильным решением будет чтобы сохранять значения во время onSaveInstanceState, а затем получать эти значения после воссоздания вашей активности.

This post является обязательным для правильной обработки изменений конфигурации.

ОРИГИНАЛЬНЫЙ ОТВЕТ:

Может быть, это поможет, добавьте эту строку в соответствующей деятельности теге в вашем файле манифеста:

android:configChanges="orientation|screenSize" 

Это гарантирует, что OnCreate не вызывается, когда экран вращается , вы говорите в ОС Android, эй, я сам буду обрабатывать ротацию для этой деятельности, вам не нужно начинать с onCreate.

+0

Спасибо ... это прекрасно. :) И спасибо за объяснение. Странно, что метод 'state.getClass() ...' возвратил 'android.preference.DialogPreference & SavedState' вместо 'hu.test.android.demo.ui.DayPreference & SavedState'. Может, в этом причина? – wyzard

+0

anytime dude :) –

+0

Очень плохое решение, [см. Почему здесь] (http://stackoverflow.com/a/7990543/5288316) –