2010-09-03 3 views
4

Возможно ли это изменить TextView и EditText. Подобно отображению текста при необходимости, но разрешите редактирование, когда это необходимо. Есть ли способ (как в NON-XML) для редактирования TextView или без редактирования EditText?Переключение между TextView и EditText

+0

Здесь 4 года спустя, но я не нашел библиотеку или много кода для этого - так что я создал один. Это вилка предыдущей библиотеки EditText, которая поддерживает проверку ввода. Новая вилка использует ViewFlipper в комплекте с анимацией для достижения этой цели. Не стесняйтесь попробовать или внести свой вклад: github.com/RoundSparrow/android-edittext-validator –

ответ

4

Возможно ли это обменять TextView и EditText.

Поместите оба в ваш макет в том же месте. Сделайте невидимым. Переключайте видимость по мере необходимости. Или, как дети ViewSwitcher, или ViewFlipper, а также использовать их для переключения между ними.

Есть ли способ (как в NON-XML) для редактирования TextView или без редактирования EditText?

Нет, AFAIK.

+0

Какая разница между ViewSwitcher и ViewFlipper? –

+0

@Mohit Deshpande: «ViewSwitcher может иметь только два дочерних представления, из которых только один отображается одновременно». (http://developer.android.com/reference/android/widget/ViewSwitcher.html) 'ViewFlipper' поддерживает более двух и имеет дополнительные функции, такие как анимированные переходы между ними. Я использовал «ViewFlipper». – CommonsWare

+0

Я создал библиотеку (fork предыдущей библиотеки EditText, которая поддерживает проверку ввода), которая использует ViewFlipper в комплекте с анимацией для достижения этой цели. Не стесняйтесь попробовать или внести свой вклад: https://github.com/RoundSparrow/android-edittext-validator –

1

Да, на самом деле, согласно EditText коду:

EditText представляет собой тонкий шпон над TextView, который настраивает себя как редактирования.

И это очень тонкий! Вы могли бы в принципе сказать, что TextView - это EditText, который настроен так, что он не редактируется. Код для EditText настолько короток, что я поставил его в нижней части этого вопроса для справки.

Единственная реальная разница в стилях, которые устанавливаются в XML:

<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()); 
    } 
} 
+2

PS: Получаю ли я бонусные баллы за знание (очень немного) больше, чем CommonsWare? :-) – Timmmm

+3

«И это очень тонко!» - на складе Android, да.'EditText' - это, пожалуй, самый взломанный виджет # 1 от производителей устройств (например, реализация собственной логики с длинным кликом для неконтекстного контекстного меню). Хотя ваша техника, вероятно, будет работать на многих устройствах, я бы не стал ею доверять, особенно потому, что альтернативу (см. Принятый ответ) не особенно сложно использовать. – CommonsWare

Смежные вопросы