Czy istnieje sposób na zmianę wartości android: windowSoftInputMode z klasy java?

82

Chcę, aby moje karty miały różne windowSoftInputModewłaściwości dla każdej karty. Jak uzyskać dostęp do tej właściwości z klasy java, gdy cała obsługa karty jest wykonywana z jednego działania?

Czy istnieje sposób, aby uzyskać dostęp do tej właściwości manifestu z kodu Java?

Prasham
źródło

Odpowiedzi:

124

Użyj poniższych, aby zmienić softInputMode dla działania.

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

Użyj poniższych, aby zmienić typ softInput dla EditText.

mEditText.setImeOptions(EditorInfo.IME_ACTION_DONE);

Dzięki @Eliezer za korektę

AjOnFire
źródło
20
Dzięki za tę metodę setSoftInputMode ... Naprawdę mi pomogło ... Dodatkowe informacje: Aby uzyskać dostęp do właściwości takich jak adjustPani adjustResizemożesz przejść do WindowManager.LayoutParamsklasy, możesz znaleźć wiele przydatnych stałych, które mogą być użyte w setSoftInputModemetodzie
Prasham
7
@SureshBora połączyłem odpowiedź @ 66CLSjY i @aman i w końcu to dostałem: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);już to przetestowałem i naprawdę działa
Humberto Castañeda
1
Jak to jest poprawna odpowiedź? Zgodnie z developer.android.com/reference/android/view/ ... jedyne dopuszczalne wartości do przekazania Window#setSoftInputModetoWindowManager.LayoutParams.SOFT_INPUT_*
Eliezer
4
@ 66CLSjY To nie działa dla mnie. Czy możesz mi powiedzieć, czego mi brakuje? Nazywam to w ramach działania: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);ale klawiatura nadal podnosi mój układ FrameLayout, który znajduje się nad innymi widokami. Ale po prostu inne poglądy pozostają na swoim miejscu. Działa, gdy dodam go do Manifestu, ale nie chcę go stosować do całego Działania.
Tamás Kozmér
1
Czy wywołałeś setSoftInputMode przed setContentView w onCreate ()?
AjOnFire
36

Zgodnie z komentarzem Prashama , zrobiłem to i dzięki niemu uratowałem mi życie! EditTextI SoftWindowInputtryb są dość buggy gdy masz układ z ScrollViewi wypełniają je dynamicznie.

Ponieważ przejrzałem ten post, ale nadal czytałem inne odpowiedzi / komentarze (takie jak Prashan), zdecydowałem się napisać go w nowym poście.

Poniżej kod, którego użyłem z moim ScrollView:

Activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
mężczyzna
źródło
7
Cześć, trochę trudno jest przeczytać tutaj twoją odpowiedź. Widzę, że jesteś bardzo wdzięczny Prashan, ale czy możesz wyczyścić niektóre osobiste komentarze i po prostu wyjaśnić, co ten kod pomoże rozwiązać? dzięki.
Taryn East
1
Hm, nie działa, przynajmniej ustawienie regulacji panoramy. Działa tylko wtedy, gdy umieszczę to w manifeście.
Ixx
To powoduje awarię aplikacji.
Farrakh Javed
10

Staram się używać dwóch różnych trybów dla kart. Dostępne tryby to SOFT_INPUT_ADJUST_RESIZEi SOFT_INPUT_ADJUST_NOTHING.

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

Powyższa linia kodu po prostu nie działa sama. Aplikacja zawsze zachowuje się w stanie ADJUST_NOTHING. Jeśli jednak windowSoftInputMode="adjustResize"zostanie wstawiony do <activity>tagu w pliku AndroidManifest.xml, rozmiar okna aplikacji zostanie domyślnie zmieniony. Dodatkowo, gdy dzwonisz do następnej linii

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

będzie zachowywać się zgodnie z oczekiwaniami i nic nie będzie zmieniane.

Poprawa PS do odpowiedzi

Shnkc
źródło
1
Muszę przełączać się między RESIZE i NIC, jak mogę to zrobić, gdy programowo wrócę do niczego, nie zmienia się to na zmianę rozmiaru.
Taranmeet Singh
1
To naprawdę fajna obserwacja. Zasadniczo ustawienie windowSoftInputMode="adjustResize"w manifeście pomaga później w obsłudze tej flagi. Szczególnie w scenariuszu, w którym masz głównie fragmenty w pojedynczym działaniu. Można więc dynamicznie zmieniać stan wejściowy działania, programowo przełączając się z SOFT_INPUT_ADJUST_RESIZE powrotem SOFT_INPUT_ADJUST_NOTHING na żądanie. Niezłe!
sud007
1

W Xamarin Android możesz to zrobić programowo w ten sposób

 protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.DetailDesign);
             Window.SetSoftInputMode(SoftInput.AdjustPan);
        }
zubairz
źródło
0

Możesz programowo użyć następującego kodu

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

Dzięki Deepak

Sunil Kumar Sahoo
źródło