Как сделать центр подсказки 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> 

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

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

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

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

  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); } } }); 

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

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; } }); } 

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

Вы можете скрыть подсказку, когда 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); } } 

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

 <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

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

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

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

Intereting Posts
TextView lineSpacingMultiplier меньше нуля отбирает последнюю строку Переключение с OpenGL ES 1.0 на 2.0 Создание Build.FINGERPRINT на Android Есть ли способ проверить, отладка или публикация подписи приложения? Пользовательский Linear Layout Manager добавляет пустую карту в recyclerView Наложение текста поверх изображения в программном обеспечении framelayout – Android Android – ImageView On Click Ограничение использования карты Google для карт V3 в приложениях Phonegap Токен доступа удален в Android Android SDK 4.0 Создайте (повторяющийся высокий шаг) Тревога на дистанционном триггере, когда приложение не работает (iphone / android), как Find My iPhone Google Places api AutocompletePrediction prediction.getDescription () Отсутствует После обновления до Play сервисов до 9.4.0 Метод Android onClick не работает на пользовательском представлении Как определить, когда пользователь подключает гарнитуру на устройстве Android? (Напротив ACTION_AUDIO_BECOMING_NOISY) Глобальный неперехваченный обработчик исключений -> журнал электронной почты для меня? Комментарии к моему шаблону MVP для Android