Переключение между TextView и EditText - PullRequest
5 голосов
/ 03 сентября 2010

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

Ответы [ 2 ]

5 голосов
/ 03 сентября 2010

Возможно ли взаимозаменять TextView и EditText.

Поместите оба в вашем макете в одном месте. Сделай одного невидимым. Переключать видимость по мере необходимости.

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

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

Нет, AFAIK.

1 голос
/ 09 ноября 2012

Да, на самом деле, согласно коду 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());
    }
}
...