Подтвердить что ты не робот

Как сделать центр подсказки android edittext и левый курсор

Как установить текст подсказки в центре EditText и установить курсор в левой части EditText? И когда я начинаю вводить текст, он начинается с центра EditText?

введите описание изображения здесь

Теперь у меня

введите описание изображения здесь

<LinearLayout
                android:orientation="horizontal"
                android:layout_width="fill_parent"
                android:layout_height="match_parent"
                android:background="@drawable/line_white"
                android:layout_marginBottom="25dp"
                android:paddingBottom="16dp"
                android:gravity="center_horizontal">

                <EditText
                    android:id="@+id/loginEmailField"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:autoText="false"
                    android:ems="10"
                    android:hint="Choose an email adress"
                    android:inputType="textEmailAddress"
                    android:paddingLeft="2dp"
                    android:singleLine="false"
                    android:textColor="#ffffff"
                    android:textColorHint="#9377ab"
                    android:textSize="19sp"
                    android:textStyle="bold"
                    android:background="#00000000"
                    android:layout_marginRight="2dp"
                    android:gravity="center"/>
            </LinearLayout>
4b9b3361

Ответ 1

Это немного глупая проблема, я знаю.. Самый простой способ решить это (и сохранить текст в центре) использует этот простой взлом:

        editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {}
        @Override
        public void afterTextChanged(Editable s) {
            if (s != null && s.toString().length() > 0){
                editText.setGravity(Gravity.CENTER);
            }else{
                editText.setGravity(Gravity.START);
            }
        }
    });

Ответ 2

Я также столкнулся с той же проблемой и подумал о двух возможных вариантах:

1. Довольно просто
Курсор в середине подсказки выглядит немного неприятно.
Так что я просто удаляю подсказку whet editText получает фокус и устанавливает его в противном случае:

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        editText.setHint(hasFocus ? "" : "My hint");
    }
});

2. Некоторые жесткие коды
В этом случае:
если editText пуст:
- установить текст для подсказки
- установить textColor в hintColor
- отключить выбор текста
- установить выделение перед текстом (setSelection(0))

если пользователь вводит какой-либо символ
- заменить подсказку на ""
- установить textColor обратно в textColor
- включить выбор текста

Шаги:
2.1 Добавить TextWatcher

editText.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { // empty }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) { // empty }

    @Override
    public void afterTextChanged(Editable s) { 
        processChangedText(s); 
    }
});

2.2 Настройте прослушиватель смены фокуса:

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
       if (hasFocus) {
           processChangedText(editText.getText());
       }
    }
});

2.3 И немного магии внутри метода processChangedText(Editable s)

private void processChangedText(Editable s) {
    String str = s.toString();
    final int colorHint = ContextCompat.getColor(getActivity(), R.color.color_hint);
    final int colorText = ContextCompat.getColor(getActivity(), R.color.color_text);

    String hint = getString(R.string.login_login_edit_hint);
    if (str.equals(hint)) {
        editText.setTextColor(colorHint);
        enableCursorMove(editText, false);
        editText.setSelection(0);
        return;
    } else {
        editText.setTextColor(colorText);
        enableCursorMove(editText, true);
    }
    if (str.isEmpty()) {
        editText.setText(hint);
    } else if (str.contains(hint)) {
        editText.setText(str.replace(hint, ""));
    } else if (str.length() == 1) {
        editText.setSelection(1);
    }
}

2.4 Метод перемещения курсора с помощью метода Enabler/disabler (вероятно, не лучший выбор, лучше создать собственный EditText, переопределяющий метод onSelectionChanged)

private void enableCursorMove(EditText editText, boolean enable) {
    editText.setOnTouchListener(enable ? null : new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            editText.setSelection(0);
            return true;
        }
    });
}

P.S. Я действительно советую вам использовать первый вариант, это довольно просто и выглядит довольно хорошо.

Ответ 3

Поместите следующее в свой код после раздувания представления:

EditText editText = (EditText)findViewById(R.id.loginEmailField);
editText.setSelection(0);

Поместите курсор в начале текста подсказки. После того, как вы начнете печатать, текст будет оставаться центрированным, и каретка будет перемещаться в конце того, что вы печатаете.

Ответ 4

Вы можете скрыть подсказку, когда EditText будет сфокусировано.
Используйте мой пользовательский EditText:
https://gist.github.com/repitch/2ca5b01a842609cfe26f3a41f825a300

public class HintHideEditText extends EditText {

    private CharSequence savedHint;

    public HintHideEditText(Context context) {
        super(context);
    }

    public HintHideEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

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

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        validateHint(focused);
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
    }

    public CharSequence getSavedHint() {
        return savedHint;
    }

    public void setSavedHint(CharSequence savedHint) {
        this.savedHint = savedHint;
        validateHint(hasFocus());
    }

    public void setSavedHint(@StringRes int resid) {
        setSavedHint(getContext().getResources().getText(resid));
    }

    private void validateHint(boolean focused) {
        if (focused) {
            savedHint = getHint();
        }
        setHint(focused ? "" : savedHint);
    }

}

Ответ 5

Нет прямого способа сделать это, но вы можете попробовать, используя следующий код

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="48dp">
    <EditText
        android:layout_width="wrap_content"
        android:layout_height="48dp"
        android:layout_gravity="center"
        android:hint="You text here"/>
</FrameLayout>

Дайте основной фон родительскому кадру и нажмите на него, чтобы сосредоточиться на editext

Ответ 6

Вместо того, чтобы использовать подсказку для редактирования текста:

  • Добавить прозрачность в цвет фона EditText
  • Добавить новый TextView непосредственно за вашим EditText - установите текст в текст подсказки.
  • Установите gravity="left" в вашем EditText - таким образом, курсор будет расположен в левой части представления.

Поместите оба вида (EditText и TextView) внутри RelativeLayout - таким образом вы можете позиционировать представление подсказки за TextView.

Ответ 7

Попробуйте этот код:

android:textCursorDrawable="@null"