Переключение между TextView и EditText
Возможно ли это для обмена TextView и EditText. Например, отображать текст, когда это необходимо, но разрешать редактирование, когда это необходимо. Существует ли метод (как в не-XML) способ редактирования TextView или не-редактирования EditText?
2 ответа:
Возможно ли это для обмена TextView и EditText.
Поместите их в свой макет в одном и том же месте. Сделай его невидимым. Переключайте видимость по мере необходимости.
Или, поставьте оба как дети
ViewSwitcher
илиViewFlipper
, и используйте это для переключения между ними.Существует ли метод (как в не-XML) способ редактирования TextView или не-редактирования EditText?
Нет, АФАИК.
Да, фактически, согласно коду
EditText
:EditText-это тонкая оболочка над TextView, которая настраивает себя на то, чтобы быть редактируемый.
И она очень тонкая! В принципе, можно сказать, что
Единственное реальное различие заключается в стилях, которые задаются в XML:TextView
- этоEditText
, который настроен на то, чтобы быть не редактируемым. Код дляEditText
настолько короток, что я помещаю его в конце этого вопроса для справки.<style name="Widget.EditText"> <item name="android:focusable">true</item> <item name="android:focusableInTouchMode">true</item> <item name="android:clickable">true</item> <item name="android:background">?android:attr/editTextBackground</item> <item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item> <item name="android:textColor">?android:attr/editTextColor</item> <item name="android:gravity">center_vertical</item> </style>
Вы можете сбросить их в
TextView
значения в java, используя что-то вроде этого:mEditView.setFocusable(false); mEditView.setFocusableInTouchMode(false); mEditView.setClickable(false); mEditView.setBackground(null); // Or setBackgroundDrawable() on early APIs. mEditView.setTextAppearance(mEditView.getContext(), android.R.attr.textAppearanceSmall); mEditView.setTextColor(Color.BLACK); // I'm not sure how to get the default here. mEditView.setGravity(Gravity.TOP | Gravity.START);
Вы, вероятно, не захотите менять все из них, например, может быть, оставить гравитацию и цвет текста/внешний вид, чтобы вещи внезапно не изменились странным образом.
EditText
кодpublic class EditText extends TextView { public EditText(Context context) { this(context, null); } public EditText(Context context, AttributeSet attrs) { this(context, attrs, com.android.internal.R.attr.editTextStyle); } public EditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected boolean getDefaultEditable() { return true; } @Override protected MovementMethod getDefaultMovementMethod() { return ArrowKeyMovementMethod.getInstance(); } @Override public Editable getText() { return (Editable) super.getText(); } @Override public void setText(CharSequence text, BufferType type) { super.setText(text, BufferType.EDITABLE); } /** * Convenience for {@link Selection#setSelection(Spannable, int, int)}. */ public void setSelection(int start, int stop) { Selection.setSelection(getText(), start, stop); } /** * Convenience for {@link Selection#setSelection(Spannable, int)}. */ public void setSelection(int index) { Selection.setSelection(getText(), index); } /** * Convenience for {@link Selection#selectAll}. */ public void selectAll() { Selection.selectAll(getText()); } /** * Convenience for {@link Selection#extendSelection}. */ public void extendSelection(int index) { Selection.extendSelection(getText(), index); } @Override public void setEllipsize(TextUtils.TruncateAt ellipsis) { if (ellipsis == TextUtils.TruncateAt.MARQUEE) { throw new IllegalArgumentException("EditText cannot use the ellipsize mode " + "TextUtils.TruncateAt.MARQUEE"); } super.setEllipsize(ellipsis); } @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); event.setClassName(EditText.class.getName()); } @Override public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(EditText.class.getName()); } }