54 votes

Barre d'action Android translucide personnalisée

J'ai parcouru les sites internet (par exemple la documentation Android, les réponses ici, etc.) pour trouver la réponse à ce que je pensais être une question assez triviale. Comment faire pour obtenir une barre d'action translucide comme celle de l'application Google Music y YouTube (les liens sont des exemples d'images) ?

Je souhaite que le contenu vidéo soit affiché en plein écran et ne soit pas contraint ou repoussé vers le bas par la barre d'action, tout en tirant parti des avantages d'un composant intégré à l'interface utilisateur. Je peux évidemment utiliser une vue entièrement personnalisée, mais je préfère tirer parti de la barre d'action si possible.

Manifeste

<activity
    android:name="videoplayer"
    android:theme="@android:style/Theme.Holo"
    android:launchMode="singleTop"
    android:configChanges="keyboardHidden|orientation"/>

Activité

// Setup action bar
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
View customActionBarView = getLayoutInflater().inflate(R.layout.player_custom_action_bar, null);
actionBar.setCustomView(customActionBarView,
                        new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT,
                                                   R.dimen.action_bar_height));
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);

Menu

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/button1"
        android:icon="@drawable/button1"
        android:showAsAction="always"/>

    <item
        android:id="@+id/button2"
        android:icon="@drawable/button2"
        android:showAsAction="always"/>
</menu>

Vue personnalisée de la barre d'action

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/custom_action_bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:gravity="center"
    android:background="@color/TranslucentBlack">

    <!--Home icon with arrow-->
    <ImageView
        android:id="@+id/home"
        android:src="@drawable/home"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"/>

    <!--Another image-->
    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:visibility="visible"/>

    <!--Text if no image-->
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:visibility="gone"/>

    <!--Title-->
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:paddingLeft="20dp"
        android:gravity="center_vertical"/>
</LinearLayout>

0 votes

102voto

MrJre Points 3725

Si vous souhaitez que votre activité soit en plein écran tout en affichant une barre d'action, mais avec un alpha, vous devez demander le mode superposé pour la barre d'action dans le champ onCreate() de votre activité :

getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);

//getWindow().requestFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY); << Use this for API 7+ (v7 support library) 

Entonces après vous appelez setContentView(..) (depuis setContentView(..) initialise également la barre d'action en plus de la définition du contenu), vous pouvez définir un objet à dessiner en arrière-plan de votre barre d'action :

getActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.actionbar_bg));

qui peut être un shape drawable avec un alpha mis dans res/drawable :

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <solid android:color="#BB000000" /> 
</shape>

Vous pouvez également effectuer cette opération de manière entièrement programmatique en créant un fichier ColorDrawable :

getActionBar().setBackgroundDrawable(new ColorDrawable(Color.argb(128, 0, 0, 0)));

Sinon, vous pouvez bien sûr masquer complètement la barre d'action ; dans ce cas, vous pouvez définir un thème personnalisé pour votre activité dans votre manifeste :

@android:style/Theme.NoTitleBar.Fullscreen

ou de manière programmatique en appelant

getActionBar().hide();

0 votes

Merci ! Je me suis dit que c'était quelque chose de simple qui me manquait.

0 votes

Savez-vous comment régler la hauteur de la barre d'action ? Ma dimension ne semble pas avoir d'effet ! actionBar.setCustomView(customActionBarView, new ActionBar.LayoutParams(ActionBar.LayoutParams.MATCH_PARENT, R.dimen.action_bar_height));

0 votes

Je ne suis pas sûr que vous puissiez réellement changer la hauteur de la barre d'action, je suppose que non, mais si possible, je recommande de ne pas le faire car c'est un composant définitif de l'interface utilisateur dans Honeycomb.

13voto

yongsunCN Points 410

En plus de la bonne réponse, si vous utilisez AppcomatActivity, appelez supportRequestWindowFeature au lieu de

Ancienne version : getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);

Vous voulez utiliser :

@Override
protected void onCreate(Bundle savedInstanceState) {
    supportRequestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
    super.onCreate(savedInstanceState);
}

9voto

Calvin Points 110

Je pense que vous devriez être en mesure de le faire en utilisant le drapeau Window FEATURE_ACTION_BAR_OVERLAY .

Avant d'appeler setContentView() dans votre activité,

Appelez :

getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);

Et il utilisera une superposition ActionBar au lieu de baisser votre fenêtre.

6voto

Le code ci-dessus est tout à fait correct pour créer une barre d'action.

Au lieu de

getActionBar().setBackgroundDrawable(new ColorDrawable(Color.argb(128, 0, 0, 0)))

utiliser

getActionBar().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

De cette façon, vous pourrez voir la barre d'action entièrement transparente.

5voto

user2254487 Points 81

Voici comment je l'ai fait fonctionner :

1) Demande de superposition de la barre d'action de manière programmatique en appelant

       getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);

cette fonction "requestFeature()" doit être demandée par la méthode "onCreate()" de votre activité avant d'appeler la fonction "setContentView(R.layout.my_layout)" :

2) définir la couleur de la barre d'action en appelant setBackgroundDrawable() comme ça :

getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#00212121")) );

cette méthode nécessite soit une référence à un drawable, soit un analyseur de couleurs pour analyser une valeur de couleur hexadécimale (les deux premiers chiffres sont utilisés pour le canal alpha, de #00 à #FF).

Notez que j'utilise l'actionBarSherlok. getSupportActionBar() mais cela devrait fonctionner avec n'importe quelle barre d'action.

Si vous n'arrivez toujours pas à le faire fonctionner, essayez d'ajouter ceci au style de votre thème

<item name="windowActionBarOverlay">true</item>
 <item name="android:actionBarStyle">@style/ActionBar.Transparent.Example</item>
 <item name="android:windowActionBarOverlay">true</item>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X