- Пользовательский интерфейс перемещается вверх при открытии клавиатуры
- Как настроить макет при появлении мягкой клавиатуры
- 9 ответов
- Android: как мне предотвратить, чтобы программная клавиатура подталкивала мой взгляд вверх?
- Android Studio – Scrollview перемещается за пределы экрана на открытой клавиатуре
- Клавиатура и аппаратные кнопки
- Аппаратные и клавиатурные клавиши
- Кнопка Back: Вы уверены, что хотите выйти из программы?
- Двойное нажатие на кнопку Back
- Кнопка Home
- Обработка кнопки Menu
- Другие кнопки
- Прячем клавиатуру
- Изменить вид клавиатуры для EditText
- Переопределяем кнопку Enter
- Интерфейс OnKeyListener
- Сдвигаем активность
- Узнать выбранный язык на клавиатуре
Пользовательский интерфейс перемещается вверх при открытии клавиатуры
Я делаю пользовательский интерфейс приложения. Когда я попытался ввести значение в EditText клавиатура переместит интерфейс вверх. Пожалуйста, помогите мне, когда клавиатура открыта, тогда она не должна перемещать пользовательский интерфейс вверх.
Это решило мою проблему.
- Используйте RelativeLayout для отображения верхней и нижней панели внутри другого RelativeLayout, который охватывает весь экран.
Для верхней панели:
Для нижней панели:
Теперь добавьте ScrollView следующим образом:
Android: layout_width = «wrap_content» android: layout_height = «wrap_content» android: layout_below = «@ + id / top» android: layout_above = «@ + id / bottom»
Теперь добавьте дочерний вид в это представление прокрутки, которое может быть любым из RelativeLayout или LineareLayout. Нам нужен этот дочерний вид, чтобы просто обернуть другие дочерние представления, которые мы хотим добавить в середине экрана, теперь все, что мы хотим увидеть, просто добавьте это представление в качестве дочернего элемента этого макета, такого как EditText или что угодно.
Теперь, когда появится KeyBoard, средняя прокрутка будет прокручиваться вверх, что не приведет к искажению вашего пользовательского интерфейса.
Надеюсь, это будет полезно, вернитесь ко мне, если у вас все еще есть проблемы с этим .. 🙂
Добавьте следующую строку вашего тега активности в манифест
Удалите эту строку android: windowSoftInputMode = «adjustResize» из тега в файле манифеста в эту активность.
Поскольку я использую TabActivity для своей основной деятельности, а затем FragmentActivity для моих вкладок, настройки манифеста, похоже, не помогают. Итак, мое решение таково:
Источник
Как настроить макет при появлении мягкой клавиатуры
Я хотел бы настроить / изменить размер макета при активации мягкой клавиатуры, как показано ниже:
до и после:
нашел пару ресурсов в SO:
но вопросы и ответы довольно неоднозначны, вот вопрос с более четкой картиной того, что я хочу.
требования:
- он должен работать на телефоне с любыми размерами экрана.
- заметил, что поле / заполнение пространства в «FACEBOOK» и » зарегистрироваться Facebook » изменился до и после.
- нет прокрутки не участвует.
9 ответов
в вашем AndroidManifest.xml, где вы объявляете это конкретное действие, и это изменит параметр изменения размера макета.
некоторый исходный код ниже для дизайна макета
этот вопрос был задан несколько лет назад, и «Secret Andro Geni» имеет хорошее базовое объяснение, а «tir38» также сделал хорошую попытку полного решения, но, увы, здесь нет полного решения. Я потратил пару часов, выясняя вещи, и вот мое полное решение с подробным объяснением внизу:
и AndroidManifest.в XML, не забудьте установить:
мысли:
я понял, что RelativeLayout это макеты, которые охватывают все доступное пространство, а затем изменяются при появлении клавиатуры.
и LinearLayout — это макеты, которые не изменяются в процессе изменения размера.
вот почему вам нужно иметь 1 RelativeLayout сразу после ScrollView чтобы охватить все доступное пространство экрана. И вам нужно иметь LinearLayout внутри RelativeLayout еще внутренности будут раздавлены при изменении размера. Хороший пример — «headerLayout». Если бы не было LinearLayout внутри RelativeLayout текст «facebook» будет раздавлен и не будет показан.
в фотографиях входа в систему «facebook», размещенных в вопросе, я также заметил, что вся часть входа (mainLayout) центрирована по вертикали по отношению ко всему экрану, следовательно, атрибут:
на LinearLayout макет. И потому, что mainLayout находится внутри LinearLayout это означает, что эта часть не изменяется (снова см. рисунок в вопросе).
Источник
Android: как мне предотвратить, чтобы программная клавиатура подталкивала мой взгляд вверх?
У меня есть вертикальный выдвижной ящик в нижней части моего приложения. Когда программная клавиатура открывается, она выдвигает язычок для выдвижного ящика вверх, поэтому она садится на верхнюю часть клавиатуры. Я на самом деле хочу, чтобы он оставался внизу экрана и становился скрытым при отображении клавиатуры.
Кто-нибудь еще сталкивался с этой проблемой? Знаете, как это исправить?
Вы можете просто поменять windowSoftInputMode флаг своей активности adjustPan в своем AndroidMainfest.xml файле внутри тега активности.
Проверьте официальную документацию для получения дополнительной информации.
Ни один из ответов не работал для меня, но это сработало:
В моем случае причина, по которой кнопки нажимались вверх, заключалась в том, что вид над ними был a ScrollView , и он сворачивался при нажатии кнопок над клавиатурой независимо от того, какое значение android:windowSoftInputMode я настраивал.
Я смог избежать того, чтобы моя нижняя строка кнопок была нажата программной клавиатурой, установив android:isScrollContainer=»false» ее ScrollView над кнопками.
Вы можете попытаться добавить этот атрибут динамически, добавив следующий код в onCreate метод вашей деятельности:
Это сработало для меня, но это:
техника его подводит.
Эти ответы здесь не помогли мне. Итак, я попробовал это:
Это работает как шарм, теперь заголовок моего приложения не исчезает. Это гладко.
Чтобы сделать это программно во фрагменте, вы можете использовать следующий код
Поместите это в onResume ()
Для будущих читателей.
Я хотел конкретного контроля над этой проблемой, поэтому я сделал следующее:
От фрагмента или действия скройте остальные виды (которые не нужны, когда клавиатура поднята), а затем восстановите их, чтобы решить эту проблему:
Просто одна строка, которая будет добавлена .
Добавьте android:windowSoftInputMode=»stateHidden|adjustPan» необходимую активность вашего manifest file .
Я только что решил 🙂
Для пользователей xamarin добавьте этот код в атрибут Activity класса MainActivity,
или вы можете добавить этот код Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing) в метод OnCreate класса MainActivity.
Этот работал для меня
Пока ответы мне не помогли, так как у меня есть кнопка и поле textInput (рядом) под textView, которое скрывалось клавиатурой, но это решило мою проблему:
Добавьте следующий код в «активность» файла манифеста.
Этот код работает.
Это было лучшее, что сработало для меня
Ну, я смотрел эти ответы, но в моем случае я попал в ту же проблему и нашел убежище благодаря очень удобному и простому решению, которое включает в себя добавление очень маленького невинного атрибута в ваш тег Scrollview, находящийся в вашем XML-файле. Это
Этот работает на меня.
если после добавления android:windowSoftInputMode=»stateHidden|adjustPan» в ваш Android манифест все равно не работает.
На это может повлиять то, что когда появится клавиатура, она перейдет в режим прокрутки, и если ваша кнопка / какие-либо объекты не будут отображены в окне прокрутки, тогда объекты будут следовать за клавиатурой и перемещать ее положение.
Проверьте свой XML, где находится ваша кнопка, и убедитесь, что она находится под вашей прокруткой, а не за ее пределами.
Надеюсь, это поможет. : D
В моем случае мне нужно было, чтобы клавиатура оставалась скрытой, и сразу после нажатия кнопки мой макет должен быть скорректирован, поэтому я просто добавил эту команду в манифест, и она стала супер правильной.
Источник
Android Studio – Scrollview перемещается за пределы экрана на открытой клавиатуре
Я хочу создать экран чата, который имеет EditText и кнопку внизу (завернутый в LinearLayout), и ScrollView для сообщений вверху. Проблема в том, что когда пользователь нажимает EditText, и клавиатура открывается, ScrollView выйдет из экрана в результате перемещения вверх. Я хотел бы переместить макет (с помощью EditBox и Button) над клавиатурой, а ScrollView – для изменения размера экрана. Проблема показана на рисунках ниже:
Как вы можете видеть, линия, которая пишет “Чат” (левое изображение), исчезла в правильном изображении.
Я использую этот код XML:
Я видел много ответов, таких как установка android:windowSoftInputMode но никто не работал. Я использую Android Studio. Любая помощь будет оценена по достоинству.
Наконец, я обнаружил, что было не так в моем случае.
- Тема была полноэкранной. В стиле деятельности у меня была эта строка, которая вызвала проблему:
- В java-коде я дал команду открыть клавиатуру в начале действия:
который также был частью проблемы
- После добавления свойства adjustResize к активности в манифесте все работало нормально:
Попробуйте заменить ScrollView на ListView следующим образом:
сохраните все сообщения в ArrayList и установите адаптер в ListView, который вы создали:
Наконец, добавьте слушателя на вашу кнопку, пишущую эти строки:
Wrap Scrollview на весь макет.
т.е. поместите editText и кнопку внутри Scrollview и установите scrollView Height для android:layout_height=»match_parent»
Источник
Клавиатура и аппаратные кнопки
Аппаратные и клавиатурные клавиши
Обработка аппаратных клавиш и клавиатуры имеет следующие методы
- onKeyDown() — вызывается при нажатии любой аппаратной клавиши;
- onKeyUp() — вызывается при отпускании любой аппаратной клавиши;
Кроме клавиш, есть ещё другие методы обработки пользовательского ввода (здесь не рассматриваются):
- onTrackballEvent() — срабатывает при движениях трекбола;
- onTouchEvent() — обработчик событий сенсорного экрана, срабатывает при касании, убирания пальца и при перетаскивании.
Чтобы ваши компоненты и активности реагировали на нажатия клавиш, переопределите обработчики событий onKeyUp() и onKeyDown():
Параметр keyCode содержит код клавиши, которая была нажата; сравнивайте его со статическими кодами клавиш, хранящимися в классе KeyEvent, чтобы выполнять соответствующую обработку.
Параметр KeyEvent также включает в себя несколько методов: isAltPressed(), isShiftPressed() и isSymPressed(), определяющих, были ли нажаты функциональные клавиши, такие как Alt, Shift или Sym. Статический метод isModifierKey() принимает keyCode и определяет, является ли нажатая клавиша модификатором.
Кнопка Back: Вы уверены, что хотите выйти из программы?
Кнопка Back (Назад) закрывает приложение, точнее текущую активность, но если приложение состоит из одной активности, то это равносильно закрытию всего приложения. В большинстве случаев вам нет никакого дела до неуклюжего пользователя, который по ошибке нажал на кнопку «Back» вместо кнопки Подарить разработчику миллион. Но, если ваша программа, будучи запущенной на телефоне пользователя, потихоньку списывает деньги клиента в счёт Фонда голодных котов, то нужно дать ему шанс задуматься и вывести диалоговое окно с вопросом: «А действительно ли вы хотите выйти из программы?»
Чтобы реализовать такую задачу, нужно переопределить поведение кнопки «Back» через метод активности onBackPressed() следующим образом:
Данный метод появился в Android 2.0. Для более ранних версий использовался стандартный код обработки onKeyDown():
Двойное нажатие на кнопку Back
Другой вариант — выход из приложения при двойном нажатии на кнопку «Back». Удобно в тех случаях, когда считаете, что пользователь может случайно нажать на кнопку, например, во время активной игры. Приложение закроется, если пользователь дважды нажмёт на кнопку в течение двух секунд.
Кнопка Home
Можно отследить нажатие кнопки Home через метод активности onUserLeaveHint():
Обработка кнопки Menu
У телефона, кроме кнопки «Back», есть ещё кнопка «Menu» для вызова команд меню (на старых устройствах). Если необходимо обрабатывать нажатия этой кнопки (например, управление в игре), то используйте следующий код (обычное и долгое нажатие):
Должен заметить, что длинное нажатие трудно уловить, так как обычное нажатие постоянно подавляет это событие.
Другие кнопки
Ну на самом деле можно отслеживать не только нажатие кнопки Меню, но и кнопку Поиска и кнопки увеличения громкости.
Обратите внимание, что для кнопки громкости возвращаем false, т.е. мы не переопределяем поведение кнопки, а оставляем её на усмотрение системы.
Пример работы с кнопками громкости можно посмотреть в статье Рингтоны. Управление громкостью
По такому же принципу работает метод onKeyUp(). Метод onKeyLongPress() можно использовать, если в методе onKeyDown() был задействован метод event.startTracking(), отслеживающий поведение кнопки. В нашем примере мы отслеживали кнопку Volume_Up.
Прячем клавиатуру
Бывает так, что при запуске активности сразу выскакивает клавиатура. Если такое поведение не нравится, то пропишите в манифесте нужное значение у атрибута android:windowSoftInputMode (см. ниже).
В некоторых случаях хочется убрать клавиатуру с экрана, не нажимая кнопку «Back», а программно. В одном моём приложении, где было много текстовых полей, я воспользовался следующим кодом при щелчке кнопки:
Код так выглядит, если писать его в Activity. Если расположить его в другом классе, экземпляр Activity нужно передать туда как параметр и вызывать методы как activity.getApplicationContext(), где activity — экземпляр Activity.
Можно избавить компонент от фокуса:
Чтобы принудительно показать клавиатуру, используйте следующий код:
Кстати, повторный вызов метода закроет клавиатуру. Указанный способ не требует наличия элементов View.
Если продолжить тему показа клавиатуры, то может возникнуть следующая ситуация. Допустим у вас есть DialogFragment с EditText. При выводе диалогового окна вам нужно установить фокус на EditText и показать клавиатуру:
Либо используйте тег для нужного EditText.
Изменить вид клавиатуры для EditText
Когда элемент EditText получает фокус, то появляется клавиатура. Можно установить нужный вид клавиатуры через атрибут InputType или программно через метод setInputType():
TYPE_CLASS_DATETIME — дата и время
TYPE_CLASS_NUMBER — цифры
TYPE_CLASS_TEXT — буквы
Переопределяем кнопку Enter
Кроме атрибута InputType можно также использовать атрибут android:imeOptions в компоненте EditText, который позволяет заменить кнопку Enter на клавиатуре на другие кнопки, например, Next, Go, Search и др. Возможны следующие значения:
- actionUnspecified: Используется по умолчанию. Система сама выбирает нужный вид кнопки (IME_NULL)
- actionGo: Выводит надпись Go. Действует как клавиша Enter при наборе адреса в адресной строке браузера (IME_ACTION_GO)
- actionSearch: Выводит значок поиска (IME_ACTION_SEARCH)
- actionSend: Выводит надпись Send (IME_ACTION_SEND)
- actionNext: Выводит надпись Next (IME_ACTION_NEXT)
- actionDone: Выводи надпись Done (IME_ACTION_DONE)
Чтобы увидеть все варианты воочию, можете создать несколько текстовых полей и переключаться между ними:
Чтобы реагировать на нажатия разных состояний кнопки Enter, необходимо реализовать интерфейс TextView.OnEditorActionListener. Небольшой пример:
В нашем примере если пользователь ищет что-то, не связанное с котом, то кнопка поиска не будет выполнять желание владельца устройства.
Также можно поменять текст на кнопке с помощью атрибута android:imeActionLabel:
Текст на кнопке поменялся, но вот обработка Enter из предыдущего примера у меня перестала работать. Мой неработающий код на память.
Upd: Читатель Максим Г. предложил следующее решение проблемы. Убираем атрибуты imeOptions, imeActionId, imeActionLabel и установим их программно.
По желанию можете отслеживать только у нужного поля. Поставьте дополнительное условие после первого блока if:
Интерфейс OnKeyListener
Чтобы среагировать на нажатие клавиши внутри существующего представления из активности, реализуйте интерфейс OnKeyListener и назначьте его для объекта View, используя метод setOnKeyListener(). Вместо того, чтобы реализовывать отдельные методы для событий нажатия и отпускания клавиш, OnKeyListener использует единое событие onKey().
Используйте параметр keyCode для получения клавиши, которая была нажата. Параметр KeyEvent нужен для распознавания типа события (нажатие представлено константой ACTION_DOWN, а отпускание — ACTION_UP).
Сдвигаем активность
Чтобы всплывающая клавиатура не заслоняла элемент интерфейса, который получил фокус, а сдвигала активность вверх, можно в манифесте для нужной активности прописать атрибут android:windowSoftInputMode с параметром adjustPan:
Также доступны и другие параметры:
- stateUnspecified — настройка по умолчанию. Система сама выбирает подходящее поведение клавиатуры.
- stateUnchanged — клавиатура сохраняет своё последнее состояние (видимое или невидимое), когда активность с текстовым полем получает фокус.
- stateHidden — клавиатура скрыта, когда открывается активность. Клавиатура появится при наборе текста. Если пользователь переключится на другую активность, то клавиатура будут скрыта, но при возвращении назад клавиатура останется на экране, если она была видима при закрытии активности.
- stateAlwaysHidden — клавиатура всегда скрывается, если активность получает фокус.
- stateVisible — клавиатура видима.
- stateAlwaysVisible — клавиатура становится видимой, когда пользователь открывает активность.
- adjustResize — размеры компонентов в окне активности могут изменяться, чтобы освободить место для экранной клавиатуры.
- adjustPan — окно активности и его компоненты не изменяются, а сдвигаются таким образом, чтобы текстовое поле с фокусом не было закрыто клавиатурой.
- adjustUnspecified — настройка по умолчанию. Система сама выбирает нужный режим.
Параметры с префиксом state можно комбинировать с настройками с префиксом adjust:
Например, чтобы показать клавиатуру при старте активности, используйте stateVisible.
Данные настройки доступны и программно. Например, код для adjustResize:
Кстати, этот код не сработает в полноэкранном режиме (флаг FLAG_FULLSCREEN). Сверяйтесь с документацией.
Узнать выбранный язык на клавиатуре
Для определения текущего языка на клавиатуре можно использовать следующий код.
Следует быть осторожным с примером. На эмуляторе с Android 6.0 пример работал корректно. На реальных устройствах у меня корректно определялся русский язык, но при переключении на английский язык выдавал пустую строку или значение «zz». В этом случае можно прибегнуть к условиям if и проверять ожидаемое значение.
Источник