2017-10-15 7 views
1

J'ai une exigence dans laquelle j'ai une MainActivity. De cette activité, j'instancier 4 fragments (DISONS Fragmenta, FragmentB, FragmentC, FragmentDComment faire pour définir windowsoftinputmode par programmation à partir de Fragments?

Sur ces quatre fragments,. 3 Fragments (Disons Fragmenta, FragmentB, FragmentC), je veux définir la windowsoftinputmode de MainActivity () sur SOFT_INPUT_ADJUST_PAN

Et sur un Fragment() disons FragmentD), je veux définir windowsoftinputmode() de MainActivity à SOFT_INPUT_ADJUST_NOTHING.

Alors ce que je fais est, sur chaque méthode onViewCreated() de Fragment I exécuter la ligne de code suivante à l'évolution LayoutParams drapeau:

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

ou

((MainActivity)getActivity()).getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); 

Le problème est qu'il ne fonctionne pas et je ne suis pas capable de définir correctementSoftInputMode et je ne peux pas empêcher le redimensionnement de la fenêtre.

lignes identiques de code fonctionne parfaitement quand je les exécute dans onCreate() de MainActivity comme indiqué:

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

Mais que la valeur est définie pour les quatre fragments. Ma déclaration MainActivity dans le manifeste est:

<activity 
    android:name="com.test.MainActivity" 
    android:launchMode="singleTask" 
    android:screenOrientation="portrait"/> 

quelqu'un peut aider à ce que je fais mal dans ce domaine. Je veux avoir un comportement différent pour les différents Fragments.

Répondre

2

essayer ce que j'ai trouvé:

but d'utiliser deux modes différents pour les onglets. Les modes sont SOFT_INPUT_ADJUST_RESIZE et SOFT_INPUT_ADJUST_NOTHING.

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

La ligne de code ci-dessus ne fonctionne tout simplement pas. L'application se comporte toujours dans un état ADJUST_NOTHING. Toutefois, si windowSoftInputMode = "adjustResize" est inséré dans la balise du fichier AndroidManifest.xml, la fenêtre de l'application est redimensionnée par défaut. En outre, lorsque vous appelez ligne suivante dans le fragment

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

il se comportera comme prévu et rien n'est redimensionné. travaillé par moi!

+0

avez-vous essayé? cela a-t-il aidé? – batsheva

+0

oui, chose était que je ne spécifiais pas windowsSoftInputMode, et pour changer windowsSoftInputMode de Fragment, il doit être déclaré dans le manifeste d'abord et de modifier par programmation à partir de Fragment. – Tarun

+0

@ Terri Pouvez-vous partager votre code qui a fonctionné, je suis actuellement en train de résoudre ce problème et rien ne semble fonctionner. – iBEK

0

Ajout de l'implémentation pour le commentaire iBEK's. Deux choses doivent être fait pour windowsSoftInputMode fonctionne correctement:

premier est d'ajouter le drapeau suivant:

windowSoftInputMode="adjustResize" 

dans AndroidManifest.xml fichier comme indiqué ci-dessous:

<activity 
     android:name="com.test.TestActivity" 
     android:windowSoftInputMode="adjustResize"/> 

ce drapeau Spécification est obligatoire pour WindowsSoftInputMode de travailler.

ajouter En second lieu suivant dans onCreate de votre activité, TestActivity dans ce cas:

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

Maintenant, il faut travailler pour tous les fragments que l'activité est l'hébergement .. J'espère que cela répond à votre question @iBEK.

+0

Je l'ai fait et il pousse juste la mise en page pour donner la salle du clavier au bas de l'écran. Cela peut sembler bien sur certains appareils plus gros, mais sur les appareils plus petits, tout est superposé. – iBEK

+0

Oui, c'est le but de ce droit, redimensionner l'application pour accueillir le clavier. Vous devez ajuster votre vue pour un tel scénario dans lequel le clavier est affiché si vous souhaitez qu'un écouteur effectue des ajustements à afficher, vous pouvez utiliser OnGlobalLayoutListener. Lien de référence: https://stackoverflow.com/questions/4312319/how-to-capture-the-virtual-keyboard-show-hide-event-in-android Ne partez pas pour la réponse acceptée mais optez pour la deuxième réponse qui contient OnGlobalLayoutListener par @amalBit Utilisez la différence de hauteur pour être "200 à 300" au lieu de 100 comme indiqué dans la réponse. – Tarun