diff options
Diffstat (limited to 'core/java/android/preference/EditTextPreference.java')
-rw-r--r-- | core/java/android/preference/EditTextPreference.java | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/core/java/android/preference/EditTextPreference.java b/core/java/android/preference/EditTextPreference.java new file mode 100644 index 0000000..a12704f --- /dev/null +++ b/core/java/android/preference/EditTextPreference.java @@ -0,0 +1,228 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.preference; + + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.res.TypedArray; +import android.os.Parcel; +import android.os.Parcelable; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.widget.EditText; +import android.widget.LinearLayout; + +/** + * A {@link Preference} that allows for string + * input. + * <p> + * It is a subclass of {@link DialogPreference} and shows the {@link EditText} + * in a dialog. This {@link EditText} can be modified either programmatically + * via {@link #getEditText()}, or through XML by setting any EditText + * attributes on the EditTextPreference. + * <p> + * This preference will store a string into the SharedPreferences. + * <p> + * See {@link android.R.styleable#EditText EditText Attributes}. + */ +public class EditTextPreference extends DialogPreference { + /** + * The edit text shown in the dialog. + */ + private EditText mEditText; + + private String mText; + + public EditTextPreference(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + mEditText = new EditText(context, attrs); + + // Give it an ID so it can be saved/restored + mEditText.setId(com.android.internal.R.id.edit); + + /* + * The preference framework and view framework both have an 'enabled' + * attribute. Most likely, the 'enabled' specified in this XML is for + * the preference framework, but it was also given to the view framework. + * We reset the enabled state. + */ + mEditText.setEnabled(true); + } + + public EditTextPreference(Context context, AttributeSet attrs) { + this(context, attrs, com.android.internal.R.attr.editTextPreferenceStyle); + } + + public EditTextPreference(Context context) { + this(context, null); + } + + /** + * Saves the text to the {@link SharedPreferences}. + * + * @param text The text to save + */ + public void setText(String text) { + final boolean wasBlocking = shouldDisableDependents(); + + mText = text; + + persistString(text); + + final boolean isBlocking = shouldDisableDependents(); + if (isBlocking != wasBlocking) { + notifyDependencyChange(isBlocking); + } + } + + /** + * Gets the text from the {@link SharedPreferences}. + * + * @return The current preference value. + */ + public String getText() { + return mText; + } + + @Override + protected void onBindDialogView(View view) { + super.onBindDialogView(view); + + EditText editText = mEditText; + editText.setText(getText()); + + ViewParent oldParent = editText.getParent(); + if (oldParent != view) { + if (oldParent != null) { + ((ViewGroup) oldParent).removeView(editText); + } + onAddEditTextToDialogView(view, editText); + } + } + + /** + * Adds the EditText widget of this preference to the dialog's view. + * + * @param dialogView The dialog view. + */ + protected void onAddEditTextToDialogView(View dialogView, EditText editText) { + ViewGroup container = (ViewGroup) dialogView + .findViewById(com.android.internal.R.id.edittext_container); + if (container != null) { + container.addView(editText, ViewGroup.LayoutParams.FILL_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + } + } + + @Override + protected void onDialogClosed(boolean positiveResult) { + super.onDialogClosed(positiveResult); + + if (positiveResult) { + String value = mEditText.getText().toString(); + if (callChangeListener(value)) { + setText(value); + } + } + } + + @Override + protected Object onGetDefaultValue(TypedArray a, int index) { + return a.getString(index); + } + + @Override + protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { + setText(restoreValue ? getPersistedString(mText) : (String) defaultValue); + } + + @Override + public boolean shouldDisableDependents() { + return TextUtils.isEmpty(mText) || super.shouldDisableDependents(); + } + + /** + * Returns the {@link EditText} widget that will be shown in the dialog. + * + * @return The {@link EditText} widget that will be shown in the dialog. + */ + public EditText getEditText() { + return mEditText; + } + + @Override + protected Parcelable onSaveInstanceState() { + final Parcelable superState = super.onSaveInstanceState(); + if (isPersistent()) { + // No need to save instance state since it's persistent + return superState; + } + + final SavedState myState = new SavedState(superState); + myState.text = getText(); + return myState; + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + if (state == null || !state.getClass().equals(SavedState.class)) { + // Didn't save state for us in onSaveInstanceState + super.onRestoreInstanceState(state); + return; + } + + SavedState myState = (SavedState) state; + super.onRestoreInstanceState(myState.getSuperState()); + setText(myState.text); + } + + private static class SavedState extends BaseSavedState { + String text; + + public SavedState(Parcel source) { + super(source); + text = source.readString(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags); + dest.writeString(text); + } + + public SavedState(Parcelable superState) { + super(superState); + } + + 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]; + } + }; + } + +} |