J'ai des problèmes avec la barre d'action / barre de navigation translucide dans le nouvel Android KitKat (4.4) et le windowSoftInputMode="adjustResize"
.
Normalement, en changeant InputMode pour AdjustResize, l'application devrait se redimensionner lorsque le clavier est affiché ... mais ici, ce ne sera pas le cas! Si je supprime les lignes pour l'effet transparent, le redimensionnement fonctionne.
Donc, si le clavier est visible, ma ListView est en dessous et je ne peux pas accéder aux derniers éléments. (Uniquement en masquant le clavier manuellement)
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="XYZ"
android:versionCode="23"
android:versionName="0.1" >
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.XYZStyle" >
<activity
android:name="XYZ"
android:label="@string/app_name"
android:windowSoftInputMode="adjustResize" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
valeurs-v19 / styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.XYZStyle" parent="@style/Theme.AppCompat.Light">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>
fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listView_contacts"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:divider="@null"
android:dividerHeight="0dp"
android:drawSelectorOnTop="true"
android:fastScrollAlwaysVisible="true"
android:fastScrollEnabled="true"
android:paddingBottom="@dimen/navigationbar__height" >
</ListView>
</RelativeLayout>
Des idées pour résoudre ce problème?
Réponses:
Il vous manque la propriété suivante:
à la racine
RelativeLayout
de la mise en page du fragment .xml.Mettre à jour:
L'année dernière, il y avait une conférence intéressante de Chris Bane qui explique en détail comment cela fonctionne:
https://www.youtube.com/watch?v=_mGDMVRO3iE
la source
Il y a un rapport de bogue connexe ici . J'ai trouvé une solution de contournement qui, à partir de tests limités, semble faire l'affaire sans répercussions. Ajoutez une implémentation personnalisée de votre racine
ViewGroup
(j'utilise presque toujoursFrameLayout
, c'est donc ce que j'ai testé) avec la logique ci-dessous. Ensuite, utilisez cette disposition personnalisée à la place de votre disposition racine et assurez-vous de la définirandroid:fitsSystemWindows="true"
. Vous pouvez alors simplement appeler àgetInsets()
tout moment après la mise en page (par exemple, ajouter unOnPreDrawListener
) pour ajuster le reste de votre mise en page pour tenir compte des inserts système, si vous le souhaitez.Étant donné que
fitSystemWindow
s est obsolète, veuillez vous reporter à la réponse ci-dessous pour terminer la solution de contournement.la source
La réponse @kcoppock est vraiment utile, mais fitSystemWindows était obsolète au niveau de l'API 20
Donc, depuis l'API 20 (KITKAT_WATCH), vous devez remplacer onApplyWindowInsets
la source
ViewCompat.setOnApplyWindowInsetsListener
dispatchApplyWindowInsets
substitution à la place (même code) a fonctionné pour moiCela a fonctionné pour moi d'avoir une barre d'état translucide et d'ajusterResize en fragment:
Créez un RelativeLayout personnalisé comme l'ont dit @ Victor91 et @kcoppock.
Utilisez CustomRelativeLayout comme mise en page parent pour votre fragment.
Déclarez le thème avec Android: windowTranslucentStatus = true
L'activité du conteneur doit être déclarée dans le manifeste avec android: windowSoftInputMode = "AdjustResize" et utiliser le thème déclaré
Veuillez utiliser correspondancesSystemWindows sur la disposition de racine de fragment!
Puis en xml,
la source
Si vous souhaitez personnaliser les inserts et que vous ciblez un niveau d'API> = 21, vous pouvez le faire sans avoir à créer un groupe de vues personnalisé. En définissant simplement le
fitsSystemWindows
remplissage, la vue de votre conteneur sera appliquée par défaut, ce que vous ne voudrez peut-être pas.Les vérifications de version sont intégrées à cette méthode et seuls les appareils> = 21 exécuteront le code à l'intérieur du lambda. Exemple de Kotlin:
Assurez-vous que votre mise en page définit toujours l'
fitsSystemWindows
indicateur, sinon l'écouteur d'inserts de fenêtre ne sera pas appelé.Ces sources sont utiles:
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec https://medium.com/@azizbekian/windowinsets-24e241d4afb9
la source
BaseFragment
, avecview.fitsSystemWindows = true
et cela fonctionne simplement sans aucune modification des mises en page XML réelles ou des sous-classes de vue.J'ai eu le même problème, Mon activité avait un ScrollView en tant que vue racine et avec la barre d'état translucide activée, elle ne se redimensionnait pas correctement lorsque le clavier montrait ... et par conséquent, l'écran ne défilait pas en cachant les vues d'entrée.
Solution: tout a été déplacé (mise en page et logique d'activité) dans un nouveau fragment. Puis changé l'activité pour n'inclure que ce fragment. Maintenant, tout fonctionne comme prévu!
Voici la disposition de l'activité:
la source
Basé sur la solution de contournement de Joseph Johnson dans Android Comment ajuster la mise en page en mode plein écran lorsque le clavier logiciel est visible
appelez cela
onCreate()
aprèssetContentView()
dans votre activité.AndroidBug5497Workaround.assistActivity(this);
un peu différent de l'original remplacer
return (r.bottom - r.top);
parreturn r.bottom;
encomputeUsableHeight()
pour une raison quelconque, je dois définir mon
fitsSystemWindows
attribut d' activité surfalse
.cette solution de contournement m'a sauvé. ça marche bien pour moi. l'espoir peut vous aider.
la classe d'implémentation est:
la source
Cela ne devrait pas fonctionner avec la barre d'état translucide; ce paramètre force la fenêtre en mode plein écran qui ne fonctionne pas avec AdjustResize.
Vous pouvez utiliser AdjustPan ou utiliser les propriétés fitsSystemWindows. Je suggérerais cependant de lire sur la fonctionnalité, elle a des effets secondaires importants:
https://medium.com/google-developers/why-would-i-want-to-fitssystemwindows-4e26d9ce1eec
la source
AndroidBug5497Workaround.java prend soin de la fuite de mémoire. besoin de code ci-dessous
Mon exemple utilisant RxJava qui appelle automatiquement removeOnGlobalLayoutListener () lorsque onPause () dans le cycle de vie de l'activité
la source
J'ai eu comme un problème.
J'ai défini windowDrawsSystemBarBackgrounds sur «true» et mon application devrait s'afficher sous la barre d'état.
C'est mon thème d'activité.
et j'ai obtenu de l'aide du blog de jianshu . vous pouvez lire du code mais du texte comme moi. J'ajoute encore quelques codes.
Ceci est ma mise en page de fragment.
Je veux que cela vous soit utile. bonne chance!
la source
la source
J'ai eu le même problème. J'ai résolu en utilisant coordinatorlayout
activity.main.xml
content_main2.xml
MainActivity.java
ajoutez maintenant cette ligne linearLayoutManager.setStackFromEnd (true);
la source
la source
Ajoutez-le d'abord à votre disposition racine.
Lorsque vous utilisez cette approche, il devient de votre responsabilité de vous assurer que les parties critiques de l'interface utilisateur de votre application (par exemple, les contrôles intégrés dans une application Maps) ne finissent pas par être couvertes par des barres système. Cela pourrait rendre votre application inutilisable. Dans la plupart des cas, vous pouvez gérer cela en ajoutant l'attribut android: fitsSystemWindows à votre fichier de mise en page XML, défini sur true. Cela ajuste le remplissage du ViewGroup parent pour laisser de l'espace pour les fenêtres système. Cela suffit pour la plupart des applications.
Dans certains cas, cependant, vous devrez peut-être modifier le remplissage par défaut pour obtenir la mise en page souhaitée pour votre application. Pour manipuler directement la disposition de votre contenu par rapport aux barres système (qui occupent un espace appelé «encarts de contenu» de la fenêtre), remplacez fitSystemWindows (encarts Rect). La méthode fitSystemWindows () est appelée par la hiérarchie des vues lorsque les encarts de contenu d'une fenêtre ont changé, pour permettre à la fenêtre d'ajuster son contenu en conséquence. En remplaçant cette méthode, vous pouvez gérer les inserts (et donc la mise en page de votre application) comme vous le souhaitez.
https://developer.android.com/training/system-ui/status#behind
Si vous souhaitez devenir un maître monteur de fenêtres, veuillez regarder la vidéo du développeur Android. https://www.youtube.com/watch?v=_mGDMVRO3iE
la source
La meilleure pratique permet à l'utilisateur de faire défiler le contenu lorsque le clavier est affiché. Donc, pour ajouter cette fonctionnalité, vous devez placer votre disposition racine dans la méthode d'activité
ScrollView
et utiliserwindowSoftInputMode="adjustResize"
.Mais si vous souhaitez utiliser cette fonctionnalité avec un
<item name="android:windowTranslucentStatus">true</item>
indicateur sur le contenu d'Android 5, le contenu ne pourra pas faire défiler et chevauchera le clavier.Pour résoudre ce problème, cochez cette réponse
la source