Android Hide Soft Keyboard от EditText, не теряя курсора
Я дошел до этого, который достает меня на полпути, но не совсем.
У меня есть dialer Fragment
, у которого есть все обычные Button
, чтобы ввести число, включая backspace, поэтому мне не нужна мягкая клавиатура. Я также хотел бы дать пользователю возможность вставлять текст (длинный клик... отлично работает по умолчанию), а также редактировать введенные данные, поэтому мне нужен курсор.
Самый простой способ, которым я нашел, чтобы убедиться, что мягкая клавиатура не появляется, если пользователь нажимает внутри EditText
, - это установить значение inputType
в null, но это также убивает курсор.
Итак, как я объявляю свой EditText
и какие команды следует запускать, чтобы в поле EditText
никогда не отображалась мягкая клавиатура, независимо от того, что пользователь пытается, но все же сохраняют функциональность вставки и курсор?
Я также пробовал android:windowSoftInputMode="stateAlwaysHidden"
в своем манифесте, но безрезультатно.
Ответы
Ответ 1
Это сработало для меня:
// Update the EditText so it won't popup Android own keyboard, since I have my own.
EditText editText = (EditText)findViewById(R.id.edit_mine);
editText.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event);
InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
return true;
}
});
Ответ 2
Наконец-то я нашел для меня рабочее решение.
Первая часть (in onCreate):
// Set to TYPE_NULL on all Android API versions
mText.setInputType(InputType.TYPE_NULL);
// for later than GB only
if (android.os.Build.VERSION.SDK_INT >= 11) {
// this fakes the TextView (which actually handles cursor drawing)
// into drawing the cursor even though you've disabled soft input
// with TYPE_NULL
mText.setRawInputType(InputType.TYPE_CLASS_TEXT);
}
Кроме того, для android: textIsSelectable необходимо установить значение true (или установить в onCreate), и EditText не должен фокусироваться на инициализации. Если ваш EditText является первым настраиваемым представлением (что было в моем случае), вы можете обойти это, поставив его чуть выше него:
<LinearLayout
android:layout_width="0px"
android:layout_height="0px"
android:focusable="true"
android:focusableInTouchMode="true" >
<requestFocus />
</LinearLayout>
Вы можете увидеть результаты этого в приложении Grapher, бесплатно и доступны в Google Play.
Ответ 3
Установка флага textIsSelectable в true отключает мягкую клавиатуру.
Вы можете установить его в своем XML-макете следующим образом:
<EditText
android:id="@+id/editText"
...
android:textIsSelectable="true"/>
Или программно, например:
EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);
Курсор по-прежнему будет присутствовать, вы сможете выбрать/скопировать/вырезать/вставить, но мягкая клавиатура никогда не будет отображаться.
Ответ 4
использовать
android:windowSoftInputMode="stateHidden"
в файле манифеста вместо android:windowSoftInputMode="stateAlwaysHidden"
Ответ 5
Лучшее решение от @Lupsaa здесь:
Установка флага textIsSelectable в true отключает мягкую клавиатуру.
Вы можете установить его в своем XML-макете следующим образом:
<EditText
android:id="@+id/editText"
...
android:textIsSelectable="true"/>
Или программно, например:
EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(истина);
Курсор по-прежнему будет присутствовать, вы сможете выбрать/скопировать/вырезать/вставить, но мягкая клавиатура никогда не будет отображаться.
Ответ 6
Это то, что я сделал.
Во-первых, в манифестной внутренней деятельности
android:windowSoftInputMode="stateAlwaysHidden|adjustNothing"
Во-вторых, в onCreate
, если внутренняя активность или onActivityCreated
, если внутри фрагмента
editText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hideSoftKeyboard(v);
}
});
Не забудьте запросить фокус на editText
editText.requestFocus();
Затем добавьте метод hideSoftKeyboard(v)
так же, как и другой ответ.
private void hideSoftKeyboard(View v){
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
Ключ здесь - requestFocus, прежде чем нажать EditText. Если без фокуса, первый щелчок заставит клавиатуру отобразиться (мой опыт). Однако это применяется, если у вас есть один EditText в действии. При этом вы по-прежнему можете вводить пользовательскую клавиатуру (если есть), можете копировать и вставлять, а курсор все еще отображается.
Ответ 7
Точная функциональность, которая вам требуется, обеспечивается установкой флага textIsSelectable
в EditText на true. При этом курсор все равно будет присутствовать, и вы сможете выбрать/скопировать/вырезать/вставить, но SoftKeyboard никогда не будет показывать. Требуется API 11 и выше.
Вы можете установить его в своем XML-макете следующим образом:
<EditText
android:textIsSelectable="true"
...
/>
Или программно, например:
EditText editText = (EditText) findViewById(R.id.editText);
editText.setTextIsSelectable(true);
Для тех, кто использует API 10 и ниже, здесь можно найти хак:
fooobar.com/questions/139478/...
Ответ 8
EditText text = (EditText) findViewById(R.id.text);
if (Build.VERSION.SDK_INT >= 11) {
text.setRawInputType(InputType.TYPE_CLASS_TEXT);
text.setTextIsSelectable(true);
} else {
text.setRawInputType(InputType.TYPE_NULL);
text.setFocusable(true);
}
Ответ 9
Это работает отлично (для меня) в 2 этапа:
-
<activity... android:windowSoftInputMode="stateHidden">
в файле манифеста
-
Добавьте эти свойства в свой XML-код editText
android:focusable="true"
android:focusableInTouchMode="true
Вам нужно поставить как 1, так и 2, только тогда он будет работать.
Приветствия
Ответ 10
Сначала добавьте android:windowSoftInputMode="stateHidden"
в ваш файл манифеста, под действием. как это
<activity... android:windowSoftInputMode="stateHidden">
На ваш XML добавить этот android:textIsSelectable="true"
. Это сделает указатель видимым.
Затем в методе действия onCreate добавьте следующее:
EditText editText = (EditText)findViewById(R.id.edit_text);
edit_text.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event);
InputMethodManager inputMethod = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (inputMethod!= null) {
inputMethod.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
return true;
}
});
Ответ 11
EditText editText = (EditText) findViewById (R.id.edit_mine); editText.setOnTouchListener(новый OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.onTouchEvent(event);
InputMethodManager imm = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
return true;
}
});
ha... это правильный способ делать... эта работа... это будет работать!
Ответ 12
Вы можете использовать следующую строку кода в методе Activity onCreate, чтобы убедиться, что клавиатура всплывает только тогда, когда пользователь щелкает или касается поля EditText. Я перепробовал много методов и кодов из stackoverflow, но ничего не получилось, но это отлично работает для меня !! Попробуй это.. :)'
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Ответ 13
Вы можете использовать следующую строку кода в методе Activity onCreate, чтобы убедиться, что клавиатура всплывает только тогда, когда пользователь щелкает или касается поля EditText. Я перепробовал много методов и кодов из stackoverflow, но ничего не получилось, но это отлично работает для меня !! Попробуй это.. :)'
this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Ответ 14
Если ваш минимальный SDK равен 21, вы можете использовать этот метод из кода Java:
editText.setShowSoftInputOnFocus(true);
Авторы статьи Чен Су.