web-dev-qa-db-fra.com

Translucide personnalisé Android ActionBar

J'ai parcouru les interwebs (par exemple Android, réponses ici, etc.) pour la réponse à ce que je pensais être une question assez triviale. Comment pouvez-vous obtenir une barre d'action translucide comme ceux de Google Music et YouTube (les liens sont des exemples d'images)?

Je veux que le contenu vidéo soit en plein écran et non contraint/poussé par la barre d'action tout en tirant parti des avantages d'un composant d'interface utilisateur intégré. Je peux évidemment utiliser une vue complètement personnalisée, mais je préférerais tirer parti de l'ActionBar 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>

Affichage de la barre d'actions personnalisée

<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>
52
colabug

Si vous souhaitez que votre activité soit en plein écran mais affiche toujours une barre d'action, mais avec un alpha, vous devez demander un mode de superposition pour la barre d'action dans 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) 

Ensuite après vous appelez setContentView(..) (puisque setContentView(..) initialise également la barre d'action à côté de la définition du contenu), vous pouvez définir un arrière-plan dessinable sur votre barre d'action:

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

qui peut être une forme dessinable avec un alpha mis en res/dessinable:

<?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 le faire complètement par programmation en créant un ColorDrawable:

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

Sinon, bien sûr, vous pouvez 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 par programmation en appelant

getActionBar().hide();
101
MrJre

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 souhaitez utiliser:

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

Je pense que vous devriez pouvoir le faire en utilisant l'indicateur de fenêtre FEATURE_ACTION_BAR_OVERLAY.

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

Appel:

getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);

Et il utilisera un ActionBar superposé au lieu de pousser vers le bas votre fenêtre.

9
Calvin

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

Au lieu de

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

utilisation

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

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

6
Android enthu.

Voici comment je l'ai fait fonctionner:

1) Demande de superposition de la barre d'actions par programmation en appelant

       getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);

cette 'requestFeature ()' doit être demandée à votre méthode d'activité 'onCreate ()' avant d'appeler pour 'setContentView (R.layout.my_layout)':

2) définissez la couleur de la barre d'actions en appelant setBackgroundDrawable() comme ceci:

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

cette méthode nécessite soit une référence à un dessinable, soit vous pouvez également utiliser un analyseur de couleur pour analyser une valeur de couleur hexadécimale (les 2 premiers chiffres sont utilisés pour le canal alpha commençant de # 00 à #FF)

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

Si vous ne pouvez toujours pas le faire fonctionner, essayez de l'ajouter à votre style de thème

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

J'aime juste partager avec vous les étapes que j'ai prises pour y parvenir:

1) Au OnCreate de votre activité,

getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);

puis

getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,
            WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

Cela se fait avant setContentView.

2) Après setContentView, vous pouvez effectuer les opérations suivantes

 getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.argb(0, 100, 181, 246)));

Lorsque la valeur alpha de 0 signifie qu'elle est entièrement transparente.

0
mechdon