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.

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?

  • Image animée recadrée
  • Réinitialiser les valeurs par défaut de Préférence
  • Est-ce que iOS a quelque chose de similaire à celui de RecyclerView d'Android?
  • Passer l'accent des parents aux enfants dans la mise en page linéaire
  • RecyclerView inside ScrollView ne fonctionne pas
  • Comment mesurer la hauteur de TextView en fonction de la largeur du périphérique et de la taille de la police?
  • Styling AutoCompleteTextView avec AppCompat.EditText ne fonctionne pas
  • Discuter du clavier lorsque vous cliquez sur l'extérieur de EditText dans 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.