2013-02-15 41 views
14

मान लें कि आप मौजूदा व्यू कार्यान्वयन से अपनी खुद की व्यू क्लास प्राप्त करना चाहते हैं, थोड़ा सा मूल्य जोड़ना, इसलिए कुछ चर बनाए रखना जो आपके व्यू के राज्य को सार्थक तरीके से प्रस्तुत करते हैं।View.onSaveInstanceState() और View.onRestoreInstanceState() View.BaseSavedState का उपयोग कर ओवरराइडिंग?

यह अच्छा होगा अगर आपका दृश्य स्वचालित रूप से अन्य लोगों की तरह ही अपने राज्य को सहेज लेगा (यदि कोई आईडी असाइन की गई हो) तो आप onRestoreInstanceState() और onSaveInstanceState() ओवरराइड करना चाहेंगे।

बेशक, आपको अपनी बेस क्लास के संबंधित तरीकों को कॉल करने की आवश्यकता है, और आपको अपनी बेस जानकारी को अपनी बेस क्लास के साथ जोड़ना होगा।

जाहिर है, ऐसा करने का एकमात्र सुरक्षित तरीका अपने सुपर क्लास 'Parcelable को अपने Parcelable में लपेटना है ताकि चाबियाँ मिश्रित न हों।

अब View.BaseSavedState है और इसके दिलचस्प getSuperState() विधि, लेकिन मैं किसी भी तरह समझने के लिए यह वास्तव में मूल्य सिर्फ व्युत्पन्न देखें राज्य मानों के साथ आधार वर्ग 'Parcelable एक Bundle में भंडारण और लौटने कि करने के लिए कहते हैं असफल। दूसरी तरफ, हो सकता है कि कुछ अन्य सिस्टम घटक सभी इंस्टेंसस्टेट जानकारी View.AbsSavedState (उदाहरण के लिए getSuperState() कहलाए जा सकें) की अपेक्षा करेंगे?

कोई अनुभव जो आप साझा करना चाहते हैं?

उत्तर

11

मुझे लगता है कि डिज़ाइन की आवश्यकता है, और जैसा कि नाम का तात्पर्य है, View.BaseSavedState के उप-वर्ग को लागू करने के लिए पार्ससेल के इंटरफ़ेस को ओवरराइड करके मूल्यों को संग्रहीत करने के लिए।

TextView.SavedState एक अच्छा उदाहरण

public static class SavedState extends BaseSavedState { 
    int selStart; 
    int selEnd; 
    CharSequence text; 
    boolean frozenWithFocus; 
    CharSequence error; 

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

    @Override 
    public void writeToParcel(Parcel out, int flags) { 
     super.writeToParcel(out, flags); 
     out.writeInt(selStart); 
     out.writeInt(selEnd); 
     out.writeInt(frozenWithFocus ? 1 : 0); 
     TextUtils.writeToParcel(text, out, flags); 

     if (error == null) { 
      out.writeInt(0); 
     } else { 
      out.writeInt(1); 
      TextUtils.writeToParcel(error, out, flags); 
     } 
    } 

    @Override 
    public String toString() { 
     String str = "TextView.SavedState{" 
       + Integer.toHexString(System.identityHashCode(this)) 
       + " start=" + selStart + " end=" + selEnd; 
     if (text != null) { 
      str += " text=" + text; 
     } 
     return str + "}"; 
    } 

    @SuppressWarnings("hiding") 
    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]; 
     } 
    }; 

    private SavedState(Parcel in) { 
     super(in); 
     selStart = in.readInt(); 
     selEnd = in.readInt(); 
     frozenWithFocus = (in.readInt() != 0); 
     text = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 

     if (in.readInt() != 0) { 
      error = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); 
     } 
    } 
} 
+0

धन्यवाद! मैंने इस मामले में कुछ उदाहरण कोड कभी नहीं देखा। इसने मेरे लिए सब कुछ स्पष्ट कर दिया है। –

+0

लिखने के लिए कभी भी SaveInstanceState द्वारा कॉल नहीं किया जाता है। इसका उद्देश्य क्या है? – dylan7

+0

@ dylan7 - राज्य को क्रमबद्ध करते समय इसे ढांचे द्वारा बुलाया जाता है। –

10

, जेम्स चेन के जवाब की मदद के लिए है here कैसे इस विधि का उपयोग करने के लिए की एक पूरी उदाहरण, चार्ल्स हार्ले द्वारा ब्लॉग article पर आधारित है। लिंक से

कोड:

public class LockCombinationPicker extends LinearLayout { 
    private NumberPicker numberPicker1; 
    private NumberPicker numberPicker2; 
    private NumberPicker numberPicker3; 

    public LockCombinationPicker(Context context) { 
     this(context, null); 
    } 

    public LockCombinationPicker(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public LockCombinationPicker(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     loadViews(); 
    } 

    private void loadViews() { 
     LayoutInflater.from(getContext()).inflate(R.layout.lock_combination_picker, this, true); 
     numberPicker1 = (NumberPicker) findViewById(R.id.number1); 
     numberPicker1.setMinValue(0); 
     numberPicker1.setMaxValue(10); 
     numberPicker2 = (NumberPicker) findViewById(R.id.number2); 
     numberPicker2.setMinValue(0); 
     numberPicker2.setMaxValue(10); 
     numberPicker3 = (NumberPicker) findViewById(R.id.number3); 
     numberPicker3.setMinValue(0); 
     numberPicker3.setMaxValue(10); 
    } 

    @Override 
    protected Parcelable onSaveInstanceState() { 
     Parcelable superState = super.onSaveInstanceState(); 
     return new SavedState(superState, numberPicker1.getValue(), numberPicker2.getValue(), numberPicker3.getValue()); 
    } 

    @Override 
    protected void onRestoreInstanceState(Parcelable state) { 
     SavedState savedState = (SavedState) state; 
     super.onRestoreInstanceState(savedState.getSuperState()); 
     numberPicker1.setValue(savedState.getNumber1()); 
     numberPicker2.setValue(savedState.getNumber2()); 
     numberPicker3.setValue(savedState.getNumber3()); 
    } 

    @Override 
    protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) { 
     // As we save our own instance state, ensure our children don't save and restore their state as well. 
     super.dispatchFreezeSelfOnly(container); 
    } 

    @Override 
    protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) { 
     /** See comment in {@link #dispatchSaveInstanceState(android.util.SparseArray)} */ 
     super.dispatchThawSelfOnly(container); 
    } 

    /** 
    * Convenience class to save/restore the lock combination picker state. Looks clumsy but once created is easy to maintain and use. 
    */ 
    protected static class SavedState extends BaseSavedState { 
     private final int number1; 
     private final int number2; 
     private final int number3; 

     private SavedState(Parcelable superState, int number1, int number2, int number3) { 
      super(superState); 
      this.number1 = number1; 
      this.number2 = number2; 
      this.number3 = number3; 
     } 

     private SavedState(Parcel in) { 
      super(in); 
      number1 = in.readInt(); 
      number2 = in.readInt(); 
      number3 = in.readInt(); 
     } 

     public int getNumber1() { 
      return number1; 
     } 

     public int getNumber2() { 
      return number2; 
     } 

     public int getNumber3() { 
      return number3; 
     } 

     @Override 
     public void writeToParcel(Parcel destination, int flags) { 
      super.writeToParcel(destination, flags); 
      destination.writeInt(number1); 
      destination.writeInt(number2); 
      destination.writeInt(number3); 
     } 

     public static final Parcelable.Creator<SavedState> CREATOR = new Creator<SavedState>() { 
      public SavedState createFromParcel(Parcel in) { 
       return new SavedState(in); 
      } 

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