Comment masquer la barre de titre d'une activité en XML avec un thème personnalisé existant

876

Je souhaite masquer la barre de titre de certaines de mes activités. Le problème est que j'ai appliqué un style à toutes mes activités, donc je ne peux pas simplement définir le thème @android:style/Theme.NoTitleBar.

L'utilisation du thème NoTitleBar comme parent de mon style supprimerait la barre de titre de toutes mes activités.

Puis-je définir un élément de style sans titre quelque part?

Janusz
la source

Réponses:

1065

Faites cela dans votre onCreate()méthode.

//Remove title bar
this.requestWindowFeature(Window.FEATURE_NO_TITLE);

//Remove notification bar
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

//set content view AFTER ABOVE sequence (to avoid crash)
this.setContentView(R.layout.your_layout_name_here); 

thisfait référence au Activity.

Embardée
la source
7
Très bonne réponse. Cependant, vous n'avez pas à faire les deux, la suppression de la barre de notification peut être exagérée.
Jim Blackler
209
Assurez-vous de le mettre avant l'appel à setContentView (R.id.x), sinon il plantera. La raison n'était pas immédiatement évidente pour moi. 08-13 12: 47: 33.561 E / AndroidRuntime (9125): java.lang.RuntimeException: impossible de démarrer l'activité ComponentInfo {com.myapp / com.myapp.SplashActivity}: android.util.AndroidRuntimeException: requestFeature () doit être appelé avant d'ajouter du contenu
mobibob
9
Vous devriez vraiment mentionner que lors de l' utilisation requestWindowFeature (), une force proche se produira si vous exécutez cette ligne après avoir ajouté tout contenu. Et sur une note secondaire, la méthode XML est beaucoup plus sûre et elle sépare également la structure de la page de votre code, (ce qui est tout le but des XML en premier lieu.)
b1nary.atr0phy
21
Cela ne fonctionne pas en utilisant l'API 22. Je vois toujours la barre de titre au démarrage de l'application.
user2966445
7
cela fonctionne si votre activité étend Activity NOT AppCompatActivity, c'est-à-dire que votre classe doit être déclarée comme classe publique myActi étend Activity {}
Manpreet Singh Dhillon
523

Vous pouvez modifier votre AndroidManifest.xml:

<activity android:name=".MainActivity"
          android:label="@string/app_name"
          android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">

ou utilisez android:theme="@android:style/Theme.Black.NoTitleBar"si vous n'avez pas besoin d'une activité plein écran.

Remarque: Si vous avez déjà utilisé une vue «par défaut», vous devez probablement également changer la classe parent de AppCompatActivityà Activity.

Redax
la source
1
Je ne sais pas pourquoi. Je n'ai utilisé que le projet par défaut et ajouté une activité. L'auto-complétion ne fonctionne pas, mais le thème est là.
Redax
82
android:theme="@android:style/Theme.Black.NoTitleBar"est probablement plus utile à moins que vous ne fassiez un jeu
Chris S
7
Ou <style name = "AppTheme" parent = "android: Theme.Light.NoTitleBar" /> pour éclairer le thème.
Fernando JS
20
Je ne sais pas pourquoi, mais cela plante mon application. De l'aide?
Akeshwar Jha
12
@Akeshwar: Vous devrez peut-être jouer avec votre fichier styles.xml. Par exemple, remplacez <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> par <style name = "AppTheme" parent = "Theme.AppCompat.Light.NoActionBar">. Dans ce cas, vous n'avez pas besoin de modifier votre fichier AndroidManifest.xml. (J'obtenais le crash, aussi, jusqu'à ce que je fasse ce correctif.)
Brit Clousing
385

J'ai maintenant fait ce qui suit.

J'ai déclaré un style héritant de tout de mon style général, puis désactivant la barre de titre.

<style name="generalnotitle" parent="general">
    <item name="android:windowNoTitle">true</item>
</style>

Maintenant, je peux définir ce style pour chaque activité dans laquelle je souhaite masquer la barre de titre en remplaçant le style à l'échelle de l'application et en héritant de toutes les autres informations de style, donc pas de duplication dans le code de style.

Pour appliquer le style à une activité particulière, ouvrez AndroidManifest.xmlet ajoutez l'attribut suivant à la activitybalise;

<activity
    android:theme="@style/generalnotitle">
Janusz
la source
13
Je crois qu'il a créé un style appelé "général" et il ne fait que l'étendre. Retirez-le simplement pour votre propre usage.
rcl
7
+1 pour répondre à la question, plutôt que de simplement spécifier la manière la plus évidente d'obtenir des résultats similaires, comme le font la plupart des autres réponses à cette question. C'est juste dommage que vous ayez dû répondre à votre propre question pour obtenir une réponse précise ...
Jules
1
cette réponse est la meilleure. Même vous pouvez utiliser n'importe quel autre thème fourni par Android sans barre de titre. Merci beaucoup pour le partage
Narendra Pal
4
Je crois que c'est une solution plus élégante que programmatique this.requestWindowFeature (Window.FEATURE_NO_TITLE); car dans ce cas, un "clignotement" du titre est toujours visible
dessus du
1
Meilleure réponse à la question OP :) Mais cela ne supprime toujours pas la barre de titre de mon activité (API19)
1111161171159459134
166

Je n'aime pas le this.requestWindowFeature(Window.FEATURE_NO_TITLE);car la barre de titre apparaît brièvement, puis disparaît.

Je n'aime pas non plus le android:theme="@android:style/Theme.NoTitleBar"parce que j'ai perdu tous les changements Holo 3.0+ auxquels les utilisateurs des nouveaux appareils se sont habitués. Je suis donc tombé sur cette solution.

Dans votre dossier res / values , créez un fichier appelé styles.xml (s'il n'existe pas déjà). Dans ce fichier, placez le code suivant:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="Theme.Default" parent="@android:style/Theme"></style>
    <style name="Theme.NoTitle" parent="@android:style/Theme.NoTitleBar"></style>
    <style name="Theme.FullScreen" parent="@android:style/Theme.NoTitleBar.Fullscreen"></style>
</resources>

Créez ensuite un res / values-v11 avec un autre fichier styles.xml (une fois encore, il peut déjà exister). Dans ce fichier, placez le code suivant:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="Theme.Default" parent="@android:style/Theme.Holo"></style>
    <style name="Theme.NoTitle" parent="@android:style/Theme.Holo.NoActionBar"></style>
    <style name="Theme.FullScreen" parent="@android:style/Theme.Holo.NoActionBar.Fullscreen"></style>
</resources>

Et si vous visez 4.0+, créez un dossier res / values-v14 avec encore un autre fichier styles.xml (Oui, il peut déjà y être). Dans ce fichier, placez le code suivant:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="Theme.Default" parent="@android:style/Theme.Holo.Light"></style>
    <style name="Theme.NoTitle" parent="@android:style/Theme.Holo.Light.NoActionBar"></style>
    <style name="Theme.FullScreen" parent="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"></style>
</resources>

Enfin, avec tous ces fichiers créés, ouvrez votre fichier AndroidManifiest.xml , vous pouvez ajouter le code:

android:theme="@style/Theme.NoTitle"

à la balise d'activité de l'activité pour laquelle vous ne voulez pas de titre ou à la balise d'application si vous souhaitez qu'elle s'applique à l'ensemble de l'application.

Maintenant, vos utilisateurs obtiendront les thèmes associés à la version de leur appareil avec la disposition d'écran que vous désirez.

PS La modification de la valeur android:theme="@style/Theme.FullScreen"aura le même effet, mais supprimera également la barre de notification.

Devin Stewart
la source
Ils ... cela fonctionne très bien pour ce que vous avez dit, mais les images ont crié lors du changement de thème. Alors que faire ???
Arun
1
@arun - Je n'ai eu aucun problème d'image avec cette méthode. Que voulez-vous dire par hurlé?
Devin Stewart
1
Meilleure réponse .. this.requestWindowFeature (Window.FEATURE_NO_TITLE); ne convient pas et <item name = "android: windowNoTitle"> true </item> a perdu le thème d'origine..Merci @DevinStewart ..accept +1 pour votre explication :)
lynndragon
5
Ah, idiot moi! J'utilisais l'ActionBarActivity, ce qui n'a aucun sens si vous voulez SUPPRIMER LA BARRE D'ACTION! Le passage à une activité simple ou à une activité fragmentée permet à cette belle solution de fonctionner comme un charme.
Scott Biggs
1
"Malheureusement YourApp s'est arrêté."
Chris Allinson
104

La barre de titre peut être supprimée de deux manières, comme indiqué sur la page Android du développeur:

Dans le manifest.xmldossier:

  1. Ajoutez ce qui suit applicationsi vous souhaitez le supprimer pour toutes les activités d'une application:

    <application android:theme="@android:style/Theme.Black.NoTitleBar">
  2. Ou pour une activité particulière:

    <activity android:theme="@android:style/Theme.Black.NoTitleBar">
ombre blanche
la source
15
Il est préférable d'utiliser android: theme = "@ android: style / Theme.DeviceDefault.NoActionBar.Fullscreen" au lieu de black.theme. Laissez l'appareil gérer le thème. mais merci, j'ai utilisé votre approche
Varand Pezeshkian
55

la bonne réponse est probablement de ne pas étendre ActionbarActivity plutôt que d'étendre simplement l'activité


si vous utilisez toujours l'activité de la barre d'action, cela semble fonctionner:

@Override
protected void onCreate(Bundle savedInstanceState) {          
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide(); //<< this
    setContentView(R.layout.activity_main);
}

semble que cela fonctionne aussi:

styles.xml:

   <style name="AppBaseTheme" parent="Theme.AppCompat.Light" >
          <item name="android:windowNoTitle">true</item>   <!-- //this -->     
   </style>

je pourrais faire comme l'a écrit Scott Biggs. ce genre de travaux. sauf qu'il n'y a pas de thème alors. je veux dire que l'arrière-plan du menu des paramètres est transparent:

il suffit de changer

public class MainActivity extends ActionBarActivity {

à Activité ou FragmentActivité

public class MainActivity extends Activity  {

Cependant, je pourrais le faire paraître assez bien en utilisant la conception matérielle et ne pas supprimer la barre d'action: https://gist.github.com/shimondoodkin/86e56b3351b704a05e53

  1. définir l'icône de l'application
  2. définir les couleurs de la barre d'action pour correspondre au design.
  3. définir l'icône dans le menu des paramètres
  4. ajouter plus d'icônes (boutons en haut)

c'est par exemple du style de barre d'action de compatibilité de conception matérielle.

Shimon Doodkin
la source
4
Changer l'ActionBarActivity en Activity a fait l'affaire pour moi!
DritanX
45

ce qui fonctionne pour moi:

1- dans styles.xml:

 <style name="generalnotitle" parent="Theme.AppCompat.Light" >
          <item name="android:windowNoTitle">true</item>   <!-- //this -->     
   </style>

2- dans MainActivity

@Override
protected void onCreate(Bundle savedInstanceState) {          
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide(); //<< this
    setContentView(R.layout.activity_main);
}
  1. en manifeste hérite du style:

    <activity android:name=".MainActivity" android:theme="@style/generalnotitle">
Flowra
la source
Comme décrit ci-dessus, parfois cela ne fonctionne pas à partir de XML. Je ne sais pas pourquoi exactement, je ne suis pas complètement sûr, mais getSupportActionBar().hide();dans onCreate () {} fera le travail
ZeePee
merci beaucoup, c'est la réponse claire et simple
Siwei Shen ago Il y a
43

Si vous utilisez, l' this.requestWindowFeature(Window.FEATURE_NO_TITLE)utilisateur pourra toujours voir la barre de titre pendant un moment pendant le lancement de l'animation lorsque l'activité commencera onCreate. Si vous utilisez @android:style/Theme.Black.NoTitleBarcomme indiqué ci-dessous, la barre de titre ne sera pas affichée pendant l'animation de lancement.

<activity 
    android:name=".MainActivity" 
    android:label="My App"
    android:theme="@android:style/Theme.Black.NoTitleBar"
    android:screenOrientation="portrait">

l'exemple ci-dessus remplacera évidemment votre thème d'application existant, si vous avez un thème existant, ajoutez- <item name="android:windowNoTitle">true</item>le.

raj c
la source
Mon activité est une instance unique avec @android: style / Theme.Black.NoTitleBar mais l'utilisation de ce code fonctionnera lorsque l'activité sera créée pour la première fois comme vous le savez. il est juste Afficher la barre d' état pour 4 Second .Comment je peux sortir de this.Here est ma question Lien est stackoverflow.com/questions/9308767/...
Herry
29

lorsque j'essayais d'utiliser toutes ces réponses très positives, mon application se bloquait toujours. (Je pense que cela a quelque chose à voir avec le "@android: style"?)

La meilleure solution pour moi était d'utiliser les éléments suivants:

android:theme="@style/Theme.AppCompat.NoActionBar"

Plus d'en-tête / barre de titre. Placez-le simplement dans le <application>...</application>ou en <activity>...</activity>fonction si vous ne le souhaitez pas dans toute l'application ou simplement dans une activité spécifique.

TryToSolveItSimple
la source
C'est le meilleur moyen (ou le seul moyen?) Si l'application "étend AppCompatActivity"!
Ferrarezi
17

Créez un thème comme ci-dessous.

 <!-- Variation on the Light theme that turns off the title -->
<style name="MyTheme" parent="android:style/Theme.Black">
    <item name="android:windowNoTitle">true</item>
</style>
sablonneux
la source
16

Ajouter

<item name="android:windowNoTitle">true</item>

dans AppTheme (styles.xml)

nijas
la source
15

Utilisez simplement getActionBar().hide();votre onCreate()méthode d' activité principale .

Anas Al Hamdan
la source
14

Vous avez juste besoin de changer de AppThemestyle dans Style.xml si vous remplacez la définition deDarkActionBar

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

à NoActionBar

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

l'AppTheme défini dans AndroidManifast.xml

Daniel Levi
la source
14

Pour AppCompat, la solution suivante a fonctionné pour moi:

Ajoutez un nouveau style de thème sans barre d'action dans votre styles.xmlensemble parent="Theme.AppCompat.NoActionBar".

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">

    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimary</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowBackground">@color/colorPrimary</item>

</style>


Maintenant, implémentez le même style de thème pour votre activité d'écran de démarrage dans androidManifest.xml

<activity
        android:name=".ActivityName"
        android:theme="@style/SplashTheme"> // apply splash them here 

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>

Voici le résultat:

entrez la description de l'image ici

Krunal
la source
11

Vous pouvez utiliser ce code dans votre fichier java

ajoutez cette ligne avant de définir ou de charger votre vue

requestWindowFeature(Window.FEATURE_NO_TITLE); 
setContentView(R.layout.activity_main);
Aneh Thakur
la source
11

Dans votre onCreateméthode, utilisez l'extrait de code suivant:

this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
Mahesh
la source
l'application commence avec le titre et elle se cache, elle montre montrer l'application sans titre
Bachask8
10

Ajoutez les deux pour le thème que vous utilisez:

    <item name="windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
développeur android
la source
"Malheureusement YourApp s'est arrêté."
Chris Allinson
<item name="windowActionBar">false</item>provoque le blocage de l'application. c'est peut-être ce que @ChrisAllinson voulait dire
Mubashar
Je ne peux pas confirmer. Fonctionne bien pour moi.
développeur Android
10

Ajoutez ce style à votre fichier style.xml

 <style name="AppTheme.NoActionBar">
     <item name="windowActionBar">false</item>
     <item name="windowNoTitle">true</item>
 </style>

Après cela, faites référence à ce nom de style dans votre androidManifest.xml dans une activité perticulaire dans laquelle vous ne voulez pas voir la barre de titre, comme ci-dessous.

<activity android:name=".youractivityname"
     android:theme="@style/AppTheme.NoActionBar">
</activity>
Personne
la source
vous avez oublié le android:préfixe avant les noms dans votre premier bloc de code :)
Stam Kaly
8

J'utilise un widget de support Toolbar v7. Donc, pour pouvoir supprimer ou masquer le titre, nous devons l'écrire.

Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(myToolbar);

//Remove¡ing title bar
getSupportActionBar().setDisplayShowTitleEnabled(false);
MontDeska
la source
réponse parfaite.
Asesha George
7

Ou si vous souhaitez masquer / afficher la barre de titre à tout moment:

private void toggleFullscreen(boolean fullscreen)
{
    WindowManager.LayoutParams attrs = getWindow().getAttributes();
    if (fullscreen)
    {
        attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
    }
    else
    {
        attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
    }
    getWindow().setAttributes(attrs);
}
cprcrack
la source
6

Dans mon cas, si vous utilisez Android Studio 2.1 et que votre version du SDK de compilation est 6.0, accédez simplement à votre fichier manifest.xml et modifiez le code suivant:

Voici le code:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.lesterxu.testapp2">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.NoActionBar">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Et voici le snip shoot (voir le code surligné): entrez la description de l'image ici

Lester
la source
Bienvenue chez SO. Veuillez publier votre code directement sur SO plutôt que de publier une image de votre code.
Richard Erickson
6

Cela a résolu mon problème

En manifeste mon activité:

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".SplashScreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Dans le style sous le nom "AppTheme":

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme"
        parent="Theme.AppCompat.Light.NoActionBar">
        **<item name="windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>**
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>
Sam
la source
6

Pour masquer le titre et la barre d'action, j'ai fait ceci:

Dans le tag d'activité du manifeste:

android:theme="@style/AppTheme.NoActionBar"

Dans Activity.java avant setContentView:

this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

c'est à dire,

// Supprimer la barre de titre

this.requestWindowFeature (Window.FEATURE_NO_TITLE);

// Supprimer la barre de notification

this.getWindow (). setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

REMARQUE : vous devez conserver ces lignes avantsetContentView

Shylendra Madda
la source
Je ne suis pas très expérimenté en Java ou en création d'applications Android, donc votre commentaire selon lequel ces lignes de code devraient être localisées avant setContentView est ce qui a vraiment aidé! Merci!
Kyle van Til
5

La première réponse est l'amphibole. voici mon explication: ajoutez:

this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);

dans la méthode oncreate ().

avant:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);

(pas juste avant setContentView) si vous ne le faites pas, vous obtiendrez forceclose. Attribuez +1 à cette réponse.

David
la source
4

J'ai trouvé deux raisons pour lesquelles cette erreur peut se produire.

Une. Les indicateurs de fenêtre sont déjà définis à l'intérieur, super.onCreate(savedInstanceState);auquel cas vous souhaiterez peut-être utiliser l'ordre des commandes suivant:

this.requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);      

super.onCreate(savedInstanceState);

Deux. Vous avez le bouton Back / Up à l'intérieur de la barre de titre, ce qui signifie que l'activité en cours est un enfant hiérarchique d'une autre activité, auquel cas vous souhaiterez peut-être commenter ou supprimer cette ligne de code de l'intérieur de la onCreateméthode.

getActionBar().setDisplayHomeAsUpEnabled(true);
Dzhuneyt
la source
Merci, cela m'a aidé à définir NoTitle et FullScreen sans changement de thème
Mohsen Afshin
4

Voici à quoi ressemble le code complet. Notez l'importation de android.view.Window.

package com.hoshan.tarik.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
    }
}
Tarik
la source
4

Ajoutez le thème @ style / Theme.AppCompat.Light.NoActionBar dans votre activité sur AndroidManifest.xml comme ceci

<activity
        android:name=".activities.MainActivity"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
    </activity>
Samuel Ivan
la source
3

Si vous faites ce que disent les utilisateurs YaW et Doug Paul , vous devez avoir à l'esprit que les fonctionnalités de la fenêtre doivent être définies avant d'appeler setContentView. Sinon, vous obtiendrez une exception.

Fergerm
la source
3

ajouter le fichier le plus simple,

  android:theme="@android:style/Theme.Translucent.NoTitleBar"

ajouter la ligne suivante dans votre fichier java,

  this.requestWindowFeature(Window.FEATURE_NO_TITLE);
Kunal Dharaiya
la source
3

J'utilise Android Xamarin et cela a fonctionné pour moi.

SupportActionBar.Hide();
SetContentView(Resource.Layout.activity_main);
jase
la source