Comment créer une activité transparente SANS fenêtreIlFloating

windowIsFloating alors qu'un grand magasin unique pour créer des UI à style Dialog a de nombreux — bugs — quirks.

Ce que je lutte actuellement, c'est qu'il a attribué la largeur / hauteur de l'ancêtre supérieur comme "wrap_content " plutôt que la largeur / hauteur de l'écran. Cela signifie que la conception UI habituelle de l'utilisation de "match_parents" vers le haut pour devenir "wrap_content" . Mauvais moments.

  • Démarrez le service Android après 5 minutes
  • Android Studio Vector Asset Import Error - Tags non pris en charge
  • Génération automatique de la référence @String dans Android Studio
  • Comment obtenir et annuler un PendingIntent?
  • Comment fonctionne Mono pour Android?
  • Comment modifier l'arrière-plan du titre de la boîte de dialogue Alert Android
  • Donc, ce que j'aimerais vraiment, c'est de créer une activité et d'avoir une mise en page comme ça:

     <LinearLayout android:layout_height="wrap_content" android:layout_width="match_parent" android:orientation="vertical" android:id="@+id/containerPageConatiner" android:background="@drawable/windowBackground"> <View android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> <FrameLayout android:id="@+id/singlePane" android:layout_height="wrap_content" android:layout_width="match_parent" android:layout_gravity="center_horizontal|center_vertical" android:padding="10dp"/> <View android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> </LinearLayout> 

    Ce qui produit une interface utilisateur affichant une seule fenêtre (@ id / singlePane) sur l'activité de l'Activité qui l'a appelée.

    Est-ce que quelqu'un a le juste ensemble de styles requis pour créer une activité arrière-plan transparente?

  • Android.content.ActivityNotFoundException:
  • Comment utiliser l'API Android KeyStore avec API 18?
  • Raccourci pour basculer entre le design et le texte dans le studio Android
  • Commutateur personnalisé - la taille de la piste et du sélecteur ne fonctionne pas au-dessous de 21 API
  • Comment afficher un classement avec les services Google Play Play?
  • Vérifiez la connexion réseau Android
  • 3 Solutions collect form web for “Comment créer une activité transparente SANS fenêtreIlFloating”

    Merci à @PolamReddy qui m'a poussé vers la réponse que je voulais:

    Le thème Theme.Translucent.NoTitleBar.Fullscreen et ses ancêtres contiennent tous les attributs dont vous avez besoin pour créer une fenêtre translucide. Afin de tout distinguer de windowIsFloating je suis passé par la pile d'ancêtres et j'ai retiré l'ensemble des attributs:

     <style name="Theme.CustomTheme.TransparentActivity"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:colorBackgroundCacheHint">@null</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowAnimationStyle">@android:style/Animation</item> <item name="android:windowNoTitle">true</item> <item name="android:windowContentOverlay">@null</item> <item name="android:windowFullscreen">true</item> </style> 

    Ce style doit être affecté à l' Activity dans AndroidManifest.xml plutôt que la vue racine d'une mise en page.

    Utiliser comme ceci pour l'activité dans le fichier manifeste (le thème représente la transparence de cette activité).

     <activity android:name=".Settings" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> 

    La réponse acceptée fonctionne bien, jusqu'à ce que je dois avoir un EditText dans la fenêtre de style de dialogue, car le clavier IME doux ne pousserait pas la "boîte de dialogue" sans windowIsFloating . Je dois donc aborder le «bug» de front.

    Comme pour le cas dans la question, je dois avoir la largeur définie pour "match_parent" alors que la hauteur peut rester "wrap_content" . En utilisant windowIsFloating , je windowIsFloating par configurer un ViewTreeObserver , parcourir l'arborescence de la vue pendant la mise en page et forcer la fenêtre flottante à la largeur souhaitée. L'approche est la suivante (sous onCreate() de l'activité) –

     setContentView(contentView); // set up the ViewTreeObserver ViewTreeObserver vto = contentView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { int displayWidth = -1; DisplayMetrics metrics = null; View containerView = null; @Override public void onGlobalLayout() { if (containerView == null) { // traverse up the view tree ViewParent v = contentView.getParent(); containerView = contentView; while ((v != null) && (v instanceof View)) { containerView = (View) v; v = v.getParent(); } } if (metrics == null) { metrics = new DisplayMetrics(); } Display display = getWindowManager().getDefaultDisplay(); display.getMetrics(metrics); if (displayWidth != metrics.widthPixels) { displayWidth = metrics.widthPixels; WindowManager.LayoutParams params = (WindowManager.LayoutParams) containerView.getLayoutParams(); // set the width to the available width to emulate match_parent params.width = displayWidth; // windowIsFloating may also dim the background // do this if dimming is not desired params.dimAmount = 0f; containerView.setLayoutParams(params); getWindowManager().updateViewLayout(containerView, params); } } }); 

    Cela fonctionne jusqu'à Android 7 jusqu'à présent (même en mode écran partagé), mais on peut attraper l'exception de coulée possible pour la diffusion sur WindowManager.LayoutParams au cas où des modifications futures de mise en œuvre et ajouter removeOnGlobalLayoutListener(); Dans un endroit approprié.

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