Faire des fragments en plein écran par programme

J'ai un ViewPager et FragmentPagerAdapter mis en place dans une activité avec 3 fragments. Tous les fragments sont chargés simultanément et sont conservés en mémoire en utilisant

mPager.setOffscreenPageLimit(2); 

L'un de ces fragments héberge un aperçu de caméra que je voudrais faire en plein écran, sans barre d'état ou barre d'action. Les autres fragments exigent que la barre d'action soit affichée.

  • Comment faire glisser un diaporama Android de la gauche?
  • Android: modifiez l'étiquette de l'application de manière programmée
  • Comment remplir la couleur dans l'image dans une zone particulière?
  • Comment nettoyer le support de surface lorsque le lecteur multimédia est terminé?
  • Impossible de sélectionner un autre compte Google Analytics lors de la génération du fichier de configuration pour Google Analytics
  • Comment définir l'accent sur le dernier élément dans une vue de liste dans Android
  • Comment puis-je créer uniquement le fragment d'aperçu de l'appareil photo en plein écran tout en maintenant les deux autres fragments normaux? J'ai essayé d'utiliser des thèmes, ce qui implique de briser la barre d'action.

    L'appel par programmation de ce qui suit ne contribue pas, car il oblige l'ensemble de l'activité à être plein écran (et donc les deux autres fragments avec lui):

     requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); 

    J'ai également essayé de mettre en œuvre ViewPager.OnPageChangeListener:

     public void onPageSelected(int position) { if(position == 1) getActionBar().hide(); else getActionBar().show(); } 

    Cela masque la barre d'action, mais cela ne cache pas la barre d'état du système (je parle de l'endroit où les notifications, les icônes d'état et l'heure sont), et la barre d'action cache / montre l'animation est également très agitée lors du balayage.

    Pour un exemple de ce que je veux faire exactement, consultez Snapchat – ils parviennent à retirer complètement le balayage entre la caméra et d'autres fragments.

    Modifier:

    J'ai donc changé mon OnPageSélectionné à ceci:

     public void onPageSelected(int position) { if(position == 1) { MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); MainActivity.this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); } else { MainActivity.this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); MainActivity.this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); } } 

    Cela me permet de modifier si la barre d'état s'affiche ou non. Cependant, cela entraîne une grande quantité de jank. Le même problème avec la barre d'action.

    Je remarque que dans Snapchat, la barre d'état glisse vers le haut et vers le bas une fois la modification de l'onglet terminée. Je ne suis pas sûr de la façon de mettre en œuvre cela, donc tout conseil concernant cet aspect serait apprécié.

  • Indicateur d'activité Android?
  • Comment exécuter des applications externes, téléchargées mais pas installées sur Android?
  • Amélioration des ressources de chaîne Android avec XLIFF
  • Changer le bouton Android: arrière-plan vers différents modèles
  • Comment obtenir le taux d'échantillonnage et la fréquence du fichier de musique (MP3) dans Android?
  • Android permet d'obtenir un chemin réel par Uri.getPath ()
  • 2 Solutions collect form web for “Faire des fragments en plein écran par programme”

    J'ai compris comment faire cela, bien que ce soit définitivement un hack.

    L'astuce n'est pas d'utiliser la barre d'action Android, c'est faire vos propres dans vos fichiers de mise en page.

    J'ai défini deux autres RelativeLayouts dans mon code:

     <RelativeLayout android:id="@+id/padding" android:layout_width="fill_parent" android:layout_height="25dip" android:layout_alignParentTop="true" android:background="@color/abs__background_holo_dark" /> <RelativeLayout android:id="@+id/fake_action_bar" android:layout_width="fill_parent" android:layout_height="48.0dip" android:layout_below="@id/padding" > <!-- stuff here --> </RelativeLayout> 

    Le dernier RelativeLayout est le rembourrage pour la barre d'état Android. Je l'ai mis sur 25dip, mais cela peut varier – il serait préférable de définir cette valeur par programme. De plus, vous devez le définir sur une couleur noire afin qu'il corresponde à la couleur de la barre d'état et rend l'interface utilisateur plus naturelle.

    Le rapport relatifLayout inférieur correspond à votre fausse barre d'action. Vous devez intégrer tout ce que votre barre d'action a besoin (texte du titre, boutons, etc.) dans ReliteLayout. Je l'ai mis sur 48dip, mais encore une fois, cela va varier et vous devriez probablement le configurer par programme.

    Dans l'Activité hébergeant vos Fragments, ViewPager et FragmentPagerAdapter, vous devez définir les indicateurs indiquant à Android de faire de la barre d'état une superposition:

     WindowManager.LayoutParams params = getWindow().getAttributes(); params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; 

    Maintenant, nous devons faire en sorte que la barre d'état se cache et montre lorsque nous changeons de fragments. Demandez à votre activité d'implémenter ViewPager.OnPageChangeListener, puis utilisez le code suivant:

     @Override public void onPageScrollStateChanged(int state) { switch(state) { case ViewPager.SCROLL_STATE_IDLE: if(mPosition == 1) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); } else { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); } } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mPosition = position; } 

    Nous surveillons le numéro de page à l'aide de OnPageSélectionné et l'utilisons dans onPageScrollStateChanged pour cacher / afficher dynamiquement la barre d'état en fonction de quel Fragment est actuellement affiché. Vous ne pouvez pas le faire dans OnPageSelected, car cela entraînera une réorganisation de la barre d'état à mi-course.

    Vous devez également vous assurer d'ajouter un code approprié à votre fausse barre d'action – pour les boutons, ce serait OnClickListener.

    Tout d'abord, dans l'activité / fragment que vous souhaitez cacher la barre d'état: Créez une static publique du fragment.

     public static Fragment QSFrag; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); QSFrag = this; } 

    Ensuite, dans votre OnPageSelectionné:

     public void onPageSelected(int position) { // TODO Auto-generated method stub if(position == 1){ mActionBar.hide(); YourActivityWithNoStatusOrActionBar.QSFrag.getActivity().getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); }else{ mActionBar.show(); // mActionBar.setSelectedNavigationItem(position); I use this, not sure u need/want it. } } 

    Je viens de le tester, et ça marche. Mais il ne semble pas génial lorsque vous quittez le fragment sans barre d'état. : P

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.