J'aimerais intégrer quelque chose comme ceci:
Et je l’ai fait comme ça, mais je n'arrive pas à mettre l’imageview en dessous de la barre d’outils. Sans la barre d'outils, je peux le faire sous la barre d'état, mais il est impossible de combiner ces deux éléments.
Voici ma mise en page:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:fitsSystemWindows="true"
tools:context="com.project.Android.PhotoActivity">
<Android.support.v7.widget.Toolbar
Android:id="@+id/photo_tl"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="#59000000"
tools:ignore="UnusedAttribute" />
<ImageView
Android:id="@+id/photo_image"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:adjustViewBounds="true"
Android:scaleType="fitStart" />
</LinearLayout>
Dans mon activité, j'ai effectué les tâches suivantes:
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
J'ai également déclaré un fichier styles-v21.xml:
<style name="Project.Photo" parent="Project.Light">
<item name="Android:windowDrawsSystemBarBackgrounds">true</item>
<item name="Android:statusBarColor">#59000000</item>
</style>
Et définissez-le comme style par défaut pour PhotoActivity . J'ai déjà essayé de placer la barre d'outils dans un FrameLayout, mais ma barre d'outils se cache tout simplement comme ceci:
Merci d'avance.
Cela a été corrigé, mais la barre d'outils chevauche la barre d'état. Est-il possible de réparer le rembourrage? Si j'utilise Android: fitsSystemWindows = "true", la barre d'état n'est plus translucide.
Je supprimerais la Toolbar
de votre mise en page et utiliserais une implémentation d'une ActionBar
du AppCompat.Theme
:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
Ensuite, je créerais un nouveau style pour la ActionBar
semi-transparente __ (dans values/styles.xml
:
<style name="AppTheme.Transparent" parent="AppTheme">
<item name="windowActionBarOverlay">true</item>
</style>
Et en v21/styles.xml
:
<style name="AppTheme.Transparent" parent="AppTheme">
<item name="windowActionBarOverlay">true</item>
<item name="Android:windowTranslucentStatus">true</item>
</style>
Je suppose que votre Activity
étend AppCompatActivity
donc dans onCreate()
vous pouvez appeler:
Pour activer un bouton de retour:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
Pour définir votre couleur translucide:
getSupportActionBar().setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(this, R.color.yourTranslucentColor)));
Pour supprimer votre titre ActionBar
:
getSupportActionBar().setDisplayShowTitleEnabled(false);
De plus, je changerais votre racine LinearLayout
en CoordinatorLayout
car cela vous donnerait plus de contrôle sur vos mises en page (c'est un FrameLayout
plus puissant).
La couleur que j'ai utilisée est:
<color name="yourTranslucentColor">#29000000</color>
Bien sûr, vous devez vous rappeler d’appliquer ce thème à votre Activity
dans le AndroidManifest.xml
:
<activity
Android:name=".ui.activity.YourActivity"
Android:theme="@style/AppTheme.Transparent">
</activity>
En effectuant toutes ces étapes, vous devriez obtenir quelque chose comme ceci:
S'il vous plaît faites le moi savoir, si cela fonctionne pour vous.
Comme tu dis,
"J'ai déjà essayé de placer la barre d'outils dans un FrameLayout, mais ma barre d'outils est masquée, comme ceci:".
Le problème avec ceci est l'ordre dans lequel on a ajouté childView dans FrameLayout
, vous avez ajouté Toolbar en tant que premier enfant, puis ImageView. c'est pourquoi image cache la barre d'outils. Au lieu de cela, l'ordre des vues dans FameLayout
devrait être comme ceci
<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context="com.project.Android.PhotoActivity">
<ImageView
Android:id="@+id/photo_image"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:adjustViewBounds="true"
Android:scaleType="fitStart" />
<Android.support.v7.widget.Toolbar
Android:id="@+id/photo_tl"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="#59000000"
tools:ignore="UnusedAttribute" />
</FrameLayout>
Également pour le niveau d'API> = 19, vous pouvez ajouter cet attribut dans le fichier style.xml
pour rendre statusBar transparent.<item name="Android:windowTranslucentStatus">true</item>
Pour créer du contenu derrière statusBar, utilisez ce lien
https://developer.Android.com/training/system-ui/status.html#behind
Utilisez le code ci-dessous
<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/coordinator_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">
<Android.support.design.widget.AppBarLayout
Android:id="@+id/appbar"
Android:layout_width="match_parent"
Android:layout_height="300dp"
Android:fitsSystemWindows="true">
<Android.support.design.widget.CollapsingToolbarLayout
Android:id="@+id/collapsing_toolbar"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
app:contentScrim="@color/colorPrimary"
app:expandedTitleMarginEnd="64dp"
app:expandedTitleMarginStart="48dp"
app:expandedTitleTextAppearance="@style/AppTheme.CollapsingToolbarLayoutExpandedTextStyle"
app:layout_scrollFlags="scroll|exitUntilCollapsed">
<ImageView
Android:id="@+id/iv_backdrop"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
Android:scaleType="centerCrop"
app:layout_collapseMode="parallax" />
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?android:attr/actionBarSize"
Android:theme="@style/YourTheme"
app:layout_collapseMode="pin" />
</Android.support.design.widget.CollapsingToolbarLayout>
</Android.support.design.widget.AppBarLayout>
<!-- Rest of your view-->
</Android.support.design.widget.CoordinatorLayout>
Ne traitez pas la barre d'état comme quelque chose de séparé de votre application. L'image s'affiche sous la barre d'outils car vous avez utilisé LinearLayout. Si vous aviez utilisé RelativeLayout, votre image commencerait à la même hauteur que la barre d’outils.
Maintenant, pour rendre la barre d'état transparente et pour que tout commence sous la barre d'état, utilisez ce qui suit.
<style name="AppTheme.TranslucentStatusBar" >
<item name="Android:windowTranslucentStatus">true</item>
<item name="Android:windowBackground">@Android:color/transparent</item>
</style>
Utilisez le style ci-dessus pour votre activité et tout commence sous la barre d'état. Maintenant, pour la barre d’outils, vous pouvez augmenter la hauteur de la barre d’outils en ajoutant la hauteur de la barre d’état en tant que remplissage à la barre d’outils. Cela peut être fait comme suit:
toolbarContainer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect frame = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
toolbarContainer.setPadding(0, frame.top, 0, 0);
}
});
Vous pouvez définir une couleur sur la barre d'état et utiliser la même couleur avec AlphaTransparency dans la barre d'outils.
getWindow().setStatusBarColor(ContextCompat.getColor(this, Android.R.color.transparent));
Maintenant, vous contrôlez tout, y compris la barre d'état et la barre d'outils.
TLDR; Vous devez envelopper la barre d'outils dans un LinearLayout.
Ce que j'ai fait pour que cela fonctionne était similaire à l'approche de @Akhilesh Kumar, mais j'ai enveloppé la barre d'outils dans un LinearLayout qui corrigeait la superposition de la barre d'outils. Je mets également les ajustementsSystemWindows à true dans ce LinearLayout.
<FrameLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context="com.project.Android.PhotoActivity">
<ImageView
Android:id="@+id/photo_image"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:adjustViewBounds="true"
Android:scaleType="fitStart"/>
<LinearLayout
Android:id="@+id/content_card_image"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:fitsSystemWindows="true"
>
<Android.support.v7.widget.Toolbar
Android:id="@+id/photo_tl"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="#59000000"
tools:ignore="UnusedAttribute"/>
</LinearLayout>
</FrameLayout>
J'espère que ça aide.
LinearLayout
placera automatiquement la ImageView
sous la Toolbar
.
Essayez plutôt d'utiliser RelativeLayout
.
Correction de cette erreur, mais la barre d’outils chevauche la barre d’état. Est-il possible de réparer le rembourrage? Si j'utilise Android: fitsSystemWindows = "true", la barre d'état n'est plus translucide.
J'ai récemment écrit un article sur WindowInsets, vous pouvez le vérifier . Je pense que cela résoudrait votre problème.
En résumé, ce que vous devez faire est de transmettre les incrustations de fenêtre uniquement à Toolbar
via l'API ViewCompat.setOnApplyWindowInsetListener
. Mais le parent de votre Toolbar
devrait passer les encarts de fenêtre. Dans votre cas, cela ne se produira pas, car par défaut LinearLayout
et les dispositions de famille ne le feront pas, vous devez sous-classer et remplacer la méthode onApplyWindowInsets
.
Je vous suggère de lire l'article, où tout est décrit plus précisément.