Есть ли способ изменить значение android: windowSoftInputMode из класса java?

82

Я хочу, чтобы мои вкладки имели разные windowSoftInputModeсвойства для каждой вкладки. Как получить доступ к этому свойству из класса java, когда вся обработка вашей вкладки выполняется с помощью одного действия?

Есть ли способ получить доступ к этому свойству манифеста из Java-кода?

Прашам
источник

Ответы:

124

Используйте следующее, чтобы изменить softInputMode для Activity.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

Используйте следующее, чтобы изменить тип softInput для EditText.

mEditText.setImeOptions(EditorInfo.IME_ACTION_DONE);

Спасибо @Eliezer за исправление

AjOnFire
источник
20
Спасибо за этот метод setSoftInputMode ... Он мне действительно помог ... Дополнительная информация: Чтобы получить доступ к таким свойствам, как adjustPanи adjustResizeвы можете пойти в WindowManager.LayoutParamsкласс, вы можете найти много полезных констант, которые можно использовать в setSoftInputModeметоде
Prasham
7
@SureshBora я объединил ответ @ 66CLSjY и @aman, и я наконец получил это: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);я уже тестировал его, и действительно работает
Умберто Кастаньеда
1
Как это правильный ответ? В соответствии с developer.android.com/reference/android/view/... единственные приемлемые значения для передачи Window#setSoftInputModeявляютсяWindowManager.LayoutParams.SOFT_INPUT_*
Элиэзер
4
@ 66CLSjY У меня не работает. Вы можете сказать мне, что мне не хватает? Я вызываю это внутри действия: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);но клавиатура все еще подталкивает мой FrameLayout, который находится поверх других представлений. Но на этом месте другие взгляды остаются. Он работает, когда я добавляю его в манифест, но я не хочу применять его для всего действия.
Tamás Kozmér
1
Вы вызывали setSoftInputMode перед setContentView в onCreate ()?
AjOnFire 02
36

Согласно комментарию Прашама , я сделал это, и благодаря ему это спасло мне жизнь! EditTextИ SoftWindowInputрежим довольно глючный , когда у вас есть макет с ScrollViewи вы заполняете его динамически.

Поскольку я прочитал этот пост, но продолжал читать другие ответы / комментарии (например, Прашана), я решил написать его в новом посте.

Ниже кода, который я использовал со своим ScrollView:

Activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
мужчина
источник
7
привет, мой ответ немного сложно прочитать здесь. Я вижу, вы очень благодарны Прашану, но не могли бы вы убрать некоторые личные комментарии и просто объяснить, что этот код поможет решить? Благодарю.
Taryn East
1
Хм, не работает, по крайней мере, настроить панорамирование. Работает, только если выложу в манифест.
Ixx, 01
Это приводит к сбою приложения.
Фаррах Джавед
10

Я стремлюсь использовать два разных режима для вкладок. Режимы есть SOFT_INPUT_ADJUST_RESIZEи SOFT_INPUT_ADJUST_NOTHING.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Строка кода выше просто не работает сама по себе. Приложение всегда ведет себя в состоянии ADJUST_NOTHING. Однако, если windowSoftInputMode="adjustResize"он вставлен в <activity>тег в файле AndroidManifest.xml, размер окна приложения будет изменен по умолчанию. Кроме того, когда вы звоните по следующей линии

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);

он будет вести себя так, как ожидалось, и ничего не изменится.

PS улучшение ответа

ШНКЦ
источник
1
Мне нужно переключаться между ИЗМЕНИТЬ РАЗМЕР и НИЧЕГО, как это можно сделать, как только я вернусь к ничему программно, он не изменится, чтобы изменить размер.
Таранмит Сингх
1
Это действительно хорошее наблюдение. Обычно установка windowSoftInputMode="adjustResize"в манифесте помогает в обработке этого флага позже. Особенно в сценарии, когда у вас есть в основном фрагменты в одном действии. Таким образом, можно динамически изменять состояние ввода Activity, программно переключаясь с SOFT_INPUT_ADJUST_RESIZE возврата на состояние SOFT_INPUT_ADJUST_NOTHING по требованию. Хороший!
sud007
1

В Xamarin Android вы можете делать это программно

 protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.DetailDesign);
             Window.SetSoftInputMode(SoftInput.AdjustPan);
        }
зубаирз
источник
0

Вы можете программно использовать следующий код

android.view.inputmethod.InputMethodManager imm = (android.view.inputmethod.InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

Спасибо Дипак

Сунил Кумар Саху
источник