Отображение курсора внутри EditText, когда фокус не находится на EditText
Я работаю над приложением Android Smart TV:
Как я могу показать этот эффект внутри EditText
?
Ответы
Ответ 1
вы можете это сделать. Я надеюсь/думаю, что у вас есть макет для кнопок u, которые вы создали, этим вы можете установить прослушиватель фокуса для этого макета и внутри метода onFocusChange, и вы можете проверить if (layout.hasFocus()) и сделай это...
Например, если ur edittext называется et, вы можете установить это для него:
et.setActivated(true);
et.setPressed(true);
У меня есть небольшой пример кода для u, у которого есть два текста редактирования
et2.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(et2.hasFocus()){
//et1.setCursorVisible(true);
et1.setActivated(true);
et1.setPressed(true);
}
}
});
Надеюсь это поможет...
Ответ 2
Это происходит, если вы установите фон для поля. Если вы хотите решить эту проблему, установите cursorDrawable
на @null
.
Вы должны добавить textCursorDrawable
с помощью cursorVisible
.
Ссылка на чертеж, который будет нарисован под курсором вставки.
android:cursorVisible="true"
android:textCursorDrawable="@null"
Ответ 3
Вы можете попробовать что-то вроде этого:
editText.setText(text);
editText.setPressed(true);
editText.setSelection(editText.getText().length()); // moves the cursor to the end of the text
Однако с этим подходом есть две проблемы:
-
Курсор не будет мигать. Логика мигания находится в классе Editor и не может быть переопределена. Для этого требуется, чтобы EditText был сфокусирован, и только одно изображение можно сфокусировать сразу в окне - в вашем случае это будет одна из клавиш клавиатуры.
/**
* @return True when the TextView isFocused and has a valid zero-length selection (cursor).
*/
private boolean shouldBlink() {
if (!isCursorVisible() || !mTextView.isFocused()) return false;
...
}
- Курсор не всегда будет виден. Мигание курсора основано на системном времени - оно отображается на полсекунды и скрывается в течение следующих полусекунд. Курсор будет отображаться только в том случае, если код, указанный выше, вызывается в момент времени, когда курсор будет виден в соответствии с системным временем.
Вот почему родная клавиатура /IME работает так, как она есть. Это отдельное окно, которое позволяет EditText сохранять фокус и иметь мигающую функцию курсора, в то время как пользователь нажимает на "Виды" в другом окне (клавиатура /IME).
При этом существует проблема, связанная с описанными выше проблемами: убедитесь, что значение shouldBlink установлено в false, когда вам это больше не нужно, это гарантированная утечка памяти или сбоя в противном случае:
private void blink() {
if (shouldBlink) {
editText.setText(editText.getText());
editText.setPressed(true);
editText.setSelection(editText.getText().length());
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (shouldBlink) {
blink();
}
}
}, 500);
}
}
Ответ 4
В вашем XML файле макета добавьте следующую строку в текст редактирования:
<requestFocus/>
Это поместит курсор в ваш виджет editText.
Надеюсь, поможет.
Ответ 5
Существует несколько способов сделать это:
1) XML
android:cursorVisible="true"
2) Java
mEditText.setOnClickListener(editTextClickListener);
OnClickListener editTextClickListener = new OnClickListener() {
public void onClick(View v) {
if (v.getId() == mEditText.getId()) {
mEditText.setCursorVisible(true);
}
}
};
or
if (mEditText.hasFocus()){
mEditText.setCursorVisible(true);
}
Ответ 6
Вы можете использовать следующий код в своей деятельности:
//Get the EditText using
EditText et = (EditText)findViewById(R.id.editText);
//Set setCursorVisible to true
et.setCursorVisible(true);
Ответ 7
You can explicitly put caret to last position in text:
int pos = editText.getText().length();
editText.setSelection(pos);
Это всегда будет сосредоточено на первом символе на edittext.
android:focusable="true"
Ответ 8
Я знаю, что это некро, но это было намного лучше, чем решения выше. Просто расширьте EditText
и добавьте:
@Override
public boolean isCursorVisible() {
return true;
}
@Override
public boolean isFocused() {
return true;
}
И в вашем XML:
<com.foo.MyEditText
...
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
android:cursorVisible="true"/>
Теперь EditText
думает, что он сфокусирован и курсор виден, но на самом деле он не может быть сфокусирован.
Ответ 9
private void setFocusCursor(){
mBinding.replyConversationsFooter.footerEditText.setFocusable(true);
'mBinding.replyConversationsFooter.footerEditText.setFocusableInTouchMode(true);'
'mBinding.replyConversationsFooter.footerEditText.requestFocus();'
}
Просто вызовите эту функцию в oncreateView() и все.
Мы можем установить только один и только фокус на окне. Это поможет вам решить вашу проблему.
Ответ 10
Протестировано на эмуляторе API 27, 28.
Удалите атрибут background
, добавьте focusable
:
<EditText
...
android:focusable="true"
android:focusableInTouchMode="true"
/>
В коде напишите: edit.requestFocus();
Хотя подчеркивание будет видно.
Чтобы удалить подчеркивание, см. fooobar.com/questions/27200/...:
edit.getBackground().mutate().setColorFilter(ContextCompat.getColor(getContext(), R.color.white), PorterDuff.Mode.SRC_ATOP);
Чтобы изменить цвет курсора, см. fooobar.com/questions/15384828/...:
добавить android:textCursorDrawable="@drawable/shape_cursor"
, тогда как shape_cursor
:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<size
android:width="1dp"
android:height="25dp"
/>
<solid android:color="@color/gray" />
</shape>
Он работает на эмуляторе API 27, 28, но на реальном устройстве (API 21) курсор исчезает. Я пробовал много вариантов здесь и там, но ничего не помогло.
Затем я заметил, что когда EditText
содержит хотя бы один символ, он показывает курсор. Я добавил TextWatcher
, чтобы добавить пробел, когда ничего не вводилось.
private lateinit var someText: String
...
edit.requestFocus()
edit.setText(" ")
edit.addTextChangedListener(YourTextWatcher())
private inner class YourTextWatcher : TextWatcher {
override fun afterTextChanged(s: Editable?) {
someText = s.toString().trim()
if (someText.isEmpty()) {
// To not fall into infinite loop.
if (s?.length != 1) {
edit.setText(" ")
}
} else {
}
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
}
Также вы можете добавить отступы, чтобы нажать внутри EditText
, если он маленький.
Ответ 11
просто добавьте
editText.requestFocus();