2014-12-01 98 views
0

首先,对不起我的英语。定位更改后自定义DialogPreference消失

我想在我的首选项屏幕上制作一个自定义的“日期选择器”对话框。我从Android Developer站点和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是一个必须阅读才能正常处理配置更改。

原来的答案:

也许这将帮助,添加相关的活动标签内这条线在你的manifest文件:

android:configChanges="orientation|screenSize" 

这将确保的onCreate不叫当屏幕旋转时,你说的android操作系统,嘿,我会处理旋转的东西我自己这个活动,你不需要从onCreate重新开始。

+0

谢谢......它是完美的。 :)并感谢您的解释。 奇怪的是,'state.getClass()...'方法返回'android.preference.DialogPreference&SavedState'而不是'hu.test.android.demo.ui.DayPreference&SavedState'。也许这是原因? – wyzard 2014-12-01 17:25:31

+0

随时花花公子:) – 2014-12-01 17:28:37

+0

非常不好的解决方案,[看看为什么在这里](http://stackoverflow.com/a/7990543/5288316) – 2017-04-15 15:19:37