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>
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();
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);
}
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.
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.
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>
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.