Jak ukryć pasek tytułu dla działania w XML z istniejącym niestandardowym motywem


876

Chcę ukryć pasek tytułowy niektórych moich działań. Problem polega na tym, że zastosowałem styl do wszystkich moich działań, dlatego nie mogę po prostu ustawić motywu @android:style/Theme.NoTitleBar.

Użycie motywu NoTitleBar jako elementu nadrzędnego dla mojego stylu spowoduje usunięcie paska tytułu ze wszystkich moich działań.

Czy mogę gdzieś ustawić element bez tytułu?

Odpowiedzi:


1065

Zrób to w swojej onCreate()metodzie.

//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); 

thisodnosi się do Activity.


7
Świetna odpowiedź. Nie musisz jednak wykonywać obu tych czynności, usunięcie paska powiadomień może być nadmierne.
Jim Blackler,

209
Upewnij się, że umieścisz go przed wywołaniem setContentView (R.id.x), w przeciwnym razie nastąpi awaria. Powód nie był dla mnie od razu oczywisty. 08-13 12: 47: 33.561 E / AndroidRuntime (9125): java.lang.RuntimeException: Nie można uruchomić działania ComponentInfo {com.myapp / com.myapp.SplashActivity}: android.util.AndroidRuntimeException: należy wywołać requestFeature () przed dodaniem treści
mobibob,

9
Naprawdę powinieneś wspomnieć, że podczas używania requestWindowFeature () nastąpi wymuszone zamknięcie, jeśli wykonasz ten wiersz po dodaniu jakiejkolwiek treści. I na marginesie, metoda XML jest znacznie bezpieczniejsza, a także oddziela strukturę strony od twojego kodu (co jest przede wszystkim celem XML
ów

21
To nie działa przy użyciu API 22. Nadal widzę pasek tytułu początkowo podczas uruchamiania aplikacji.
user2966445

7
działa, jeśli twoja aktywność rozszerza działanie NOT AppCompatActivity, tzn. twoja klasa powinna zostać zadeklarowana jako klasa publiczna myActi przedłuża działanie {}
Manpreet Singh Dhillon

523

Możesz zmodyfikować AndroidManifest.xml:

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

lub użyj, android:theme="@android:style/Theme.Black.NoTitleBar"jeśli nie potrzebujesz aktywności na pełnym ekranie.

Uwaga: Jeśli wcześniej używałeś „domyślnego” widoku, prawdopodobnie powinieneś również zmienić klasę nadrzędną z AppCompatActivityna Activity.


1
Nie wiem dlaczego. Użyłem tylko domyślnego projektu i dodałem działanie. Autouzupełnianie nie działa, ale motyw już tam jest.
Redax

82
android:theme="@android:style/Theme.Black.NoTitleBar"jest prawdopodobnie bardziej przydatny, chyba że tworzysz grę
Chris S

7
Lub <style name = "AppTheme" parent = "android: Theme.Light.NoTitleBar" />, aby podświetlić motyw.
Fernando JS

19
Nie wiem dlaczego, ale to powoduje awarię mojej aplikacji. Jakaś pomoc?
Akeshwar Jha,

12
@Akeshwar: Być może będziesz musiał zadzierać z plikiem styles.xml. Na przykład zmień <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> na <style name = "AppTheme" parent = "Theme.AppCompat.Light.NoActionBar">. Jeśli to zrobisz, nie musisz zmieniać pliku AndroidManifest.xml. (Miałem też awarię, dopóki nie naprawiłem tego.)
Brit Clousing,

385

Zrobiłem teraz następujące.

Zadeklarowałem styl dziedziczący wszystko po moim ogólnym stylu, a następnie wyłączając pasek tytułu.

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

Teraz mogę ustawić ten styl dla każdego działania, w którym chcę ukryć pasek tytułu, zastępując styl aplikacji i dziedzicząc wszystkie inne informacje o stylu, dlatego nie ma powielania w kodzie stylu.

Aby zastosować styl do określonego działania, otwórz AndroidManifest.xmli dodaj następujący atrybut do activityznacznika;

<activity
    android:theme="@style/generalnotitle">

13
Wierzę, że stworzył styl zwany „generałem” i po prostu go rozwija. Po prostu usuń go na własny użytek.
rcl

7
+1 za udzielenie odpowiedzi na pytanie, a nie tylko określenie najbardziej oczywistego sposobu osiągnięcia podobnych rezultatów, jak większość innych odpowiedzi na to pytanie. Szkoda tylko, że musiałeś odpowiedzieć na własne pytanie, aby uzyskać dokładną odpowiedź ...
Jules

1
ta odpowiedź jest najlepsza. nawet możesz użyć dowolnego innego motywu dostarczonego przez Androida bez paska tytułu. Wielkie dzięki za udostępnienie
Narendra Pal

4
Wierzę, że jest to bardziej eleganckie rozwiązanie niż programowe this.requestWindowFeature (Window.FEATURE_NO_TITLE); ponieważ w tym przypadku nadal widoczne jest „mruganie” tytułu
powyżej

1
Najlepsza odpowiedź na pytanie OP :) Ale to nadal nie usuwa paska tytułu mojej aktywności (API19)
1111161171159459134

166

Nie podoba mi się, this.requestWindowFeature(Window.FEATURE_NO_TITLE);ponieważ pasek tytułu pojawia się na krótko, a następnie znika.

Nie podoba mi się również, android:theme="@android:style/Theme.NoTitleBar"ponieważ straciłem wszystkie zmiany Holo 3.0+, do których przyzwyczaili się użytkownicy nowych urządzeń. Natknąłem się na to rozwiązanie.

W folderze res / values utwórz plik o nazwie styles.xml (jeśli jeszcze nie istnieje). W tym pliku umieść następujący kod:

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

Następnie utwórz plik res / wartości-v11 z innym plikiem styles.xml (ponownie może to już istnieć). W tym pliku umieść następujący kod:

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

A jeśli celujesz w wersję 4.0+, utwórz folder res / wartości-v14 z jeszcze innym plikiem styles.xml (Tak, może już tam być). W tym pliku umieść następujący kod:

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

Na koniec, po utworzeniu wszystkich tych plików, otwórz plik AndroidManifiest.xml , możesz dodać kod:

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

do znacznika aktywności działania, dla którego nie chcesz mieć tytułu, lub znacznika aplikacji, jeśli chcesz, aby dotyczył on całej aplikacji.

Teraz użytkownicy otrzymają motywy związane z wersją urządzenia z pożądanym układem ekranu.

PS Zmiana wartości na android:theme="@style/Theme.FullScreen"będzie miała ten sam efekt, ale także usunie pasek powiadomień.


Działa to dobrze w stosunku do tego, co powiedziałeś, ale obrazy zmieniły się podczas zmiany motywów. Więc co robić ???
Arun

1
@arun - Nie miałem żadnych problemów z obrazem przy użyciu tej metody. Co masz na myśli przez wrzask?
Devin Stewart,

1
Najlepsza odpowiedź .. this.requestWindowFeature (Window.FEATURE_NO_TITLE); nie jest odpowiedni i <item name = "android: windowNoTitle"> true </item> zgubiłem oryginalny motyw .. Dzięki @DevinStewart ..akceptuję +1 za wyjaśnienie :)
lynndragon

5
Ach, głupie ja! Korzystałem z ActionBarActivity, co nie ma sensu, jeśli chcesz USUNĄĆ PASEK ACTION! Zmiana na proste działanie lub fragment Aktywność pozwala, aby to miłe rozwiązanie działało jak urok.
Scott Biggs,

1
„Niestety Twoja aplikacja przestała działać.”
Chris Allinson

104

Pasek tytułowy można usunąć na dwa sposoby, jak wspomniano na stronie programisty Androida:

W manifest.xmlpliku:

  1. Dodaj następujące, applicationjeśli chcesz je usunąć dla wszystkich działań w aplikacji:

    <application android:theme="@android:style/Theme.Black.NoTitleBar">
  2. Lub dla konkretnego działania:

    <activity android:theme="@android:style/Theme.Black.NoTitleBar">

15
Lepiej jest używać Androida: theme = "@ android: style / Theme.DeviceDefault.NoActionBar.Fullscreen" zamiast black.theme. Pozwól urządzeniu obsłużyć motyw. ale dzięki, zastosowałem twoje podejście
Varand Pezeshkian,

54

poprawną odpowiedzią jest prawdopodobnie nie przedłużanie ActionbarActivity, a raczej tylko działanie


jeśli nadal używasz działania paska akcji, wydaje się, że działa:

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

wydaje się, że to też działa:

styles.xml:

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

mógłbym zrobić tak, jak napisał Scott Biggs. tego rodzaju prace. z wyjątkiem tego, że nie ma motywu. Mam na myśli, że tło menu ustawień jest przezroczyste:

po prostu zmień

public class MainActivity extends ActionBarActivity {

do działania lub działania fragmentu

public class MainActivity extends Activity  {

jednak mogę sprawić, że będzie wyglądać wystarczająco dobrze, używając materiałów i nie usuwać paska akcji: https://gist.github.com/shimondoodkin/86e56b3351b704a05e53

  1. ustaw ikonę aplikacji
  2. ustaw kolory paska akcji, aby pasowały do ​​projektu.
  3. ustaw ikonę w menu ustawień
  4. dodaj więcej ikon (przyciski u góry)

jest to przykład stylistyki paska akcji kompatybilnego z projektowaniem materiałów.


4
Zmiana ActionBarActivity na Activity załatwiła sprawę!
DritanX

44

co dla mnie działa:

1- w styles.xml:

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

2- w MainActivity

@Override
protected void onCreate(Bundle savedInstanceState) {          
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide(); //<< this
    setContentView(R.layout.activity_main);
}
  1. w manifeście odziedziczy styl:

    <activity android:name=".MainActivity" android:theme="@style/generalnotitle">

Jak opisano powyżej, czasami nie działa z XML. Nie wiem dlaczego dokładnie, nie jestem do końca pewien, ale getSupportActionBar().hide();w ramach onCreate () {} wykona zadanie
ZeePee

43

Jeśli użyjesz, this.requestWindowFeature(Window.FEATURE_NO_TITLE)użytkownik nadal będzie mógł zobaczyć pasek tytułu tylko przez chwilę podczas animacji uruchamiania, gdy aktywność się rozpocznie onCreate. Jeśli używasz, @android:style/Theme.Black.NoTitleBarjak pokazano poniżej, pasek tytułowy nie będzie wyświetlany podczas animacji uruchamiania.

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

powyższy przykład oczywiście zastąpi istniejący motyw aplikacji, jeśli masz już motyw, dodaj <item name="android:windowNoTitle">true</item>go.


Moja aktywność to jedna instancja z @android: style / Theme.Black.NoTitleBar, ale użycie tego kodu będzie działać, gdy aktywność zostanie utworzona po raz pierwszy, jak znana aktywność SingleInstance, a następnie ponownie nie utworzona, więc po prostu użyj metody OnNewItent Ale teraz moim problemem jest to, gdy Activity Show to po prostu pokaż pasek stanu na 4 sekundy. Jak mogę z tego wyjść. Oto moje pytanie Link to stackoverflow.com/questions/9308767/…
Herry

29

kiedy próbowałem użyć tych wszystkich wysoko ocenianych odpowiedzi, moja aplikacja zawsze ulegała awarii. (myślę, że ma to coś wspólnego z „@android: styl”?)

Najlepszym rozwiązaniem dla mnie było użycie następujących elementów:

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

Brak paska nagłówka / tytułu. Po prostu umieść go w <application>...</application>lub w <activity>...</activity>zależności od tego, czy chcesz (nie) chcesz w całej aplikacji, czy tylko w określonej czynności.


To najlepszy sposób (czy jedyny sposób?) Jeśli aplikacja „rozszerza AppCompatActivity”!
Ferrarezi,

17

Utwórz motyw jak poniżej.

 <!-- 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>

16

Dodaj

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

wewnątrz AppTheme (styles.xml)



14

Wystarczy zmienić AppThemestyl w Style.xml, jeśli zastąpisz definicjęDarkActionBar

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

do NoActionBar

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

AppTheme zdefiniowany w AndroidManifast.xml


13

Dla AppCompatmnie zadziałało następujące rozwiązanie:

Dodaj nowy styl motywu bez paska akcji w swoim styles.xmli ustaw 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>


Teraz zaimplementuj ten sam styl motywu w aktywności na ekranie powitalnym 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>

Oto wynik:

wprowadź opis zdjęcia tutaj


11

Możesz użyć tego kodu w swoim pliku Java

dodaj tę linię przed ustawieniem lub załadowaniem widoku

requestWindowFeature(Window.FEATURE_NO_TITLE); 
setContentView(R.layout.activity_main);

11

W swojej onCreatemetodzie użyj następującego fragmentu kodu:

this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);

aplikacja zaczyna się od tytułu i ukrywa się, pokazuje pokaż aplikację bez tytułu
Bachask8

10

Dodaj oba te motywy, których używasz:

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

„Niestety Twoja aplikacja przestała działać.”
Chris Allinson

<item name="windowActionBar">false</item>powoduje awarię aplikacji. może właśnie to miał na myśli
@ChrisAllinson

Nie mogę potwierdzić. Działa dobrze dla mnie.
programista Androida

10

Dodaj ten styl do pliku style.xml

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

Po tym odwołaniu nazwa tego stylu do pliku androidManifest.xml w działaniach okołoporodowych, w których nie chcesz widzieć paska tytułu, jak poniżej.

<activity android:name=".youractivityname"
     android:theme="@style/AppTheme.NoActionBar">
</activity>

zapomniałeś android:prefiksu przed nazwami w pierwszym bloku kodu :)
Stam Kaly

8

Korzystam z widgetu pomocy Toolbar v7. Tak więc, aby móc usunąć lub ukryć tytuł, musimy to napisać.

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

//Remove¡ing title bar
getSupportActionBar().setDisplayShowTitleEnabled(false);

idealna odpowiedź.
Asesha George

7

Lub jeśli chcesz ukryć / pokazać pasek tytułu w dowolnym momencie:

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

6

W moim przypadku, jeśli używasz Androida studio 2.1, a twoja kompilowana wersja SDK to 6.0, to po prostu przejdź do pliku manifest.xml i zmień następujący kod:

Oto kod:

<?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>

A oto krótka sesja zdjęciowa (zobacz kod zaznaczenia): wprowadź opis zdjęcia tutaj


Witamy w SO. Proszę opublikować swój kod bezpośrednio na stronie SO, a nie opublikować jego obraz.
Richard Erickson

6

To rozwiązało mój problem

Manifestując moją aktywność:

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

Stylowo pod nazwą „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>

6

Aby ukryć pasek tytułu i działania, zrobiłem to:

W tagu aktywności Manifest:

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

W Activity.java przed setContentView:

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

to znaczy,

// Usuń pasek tytułu

this.requestWindowFeature (Window.FEATURE_NO_TITLE);

// Usuń pasek powiadomień

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

UWAGA : Musisz zachować te linie wcześniejsetContentView


Nie mam doświadczenia w Javie ani w tworzeniu aplikacji na Androida, więc naprawdę pomógł twój komentarz, że te wiersze kodu powinny być zlokalizowane przed setContentView! Dzięki!
Kyle van Til

5

Pierwsza odpowiedź to amfibol. oto moje wyjaśnienie: dodaj:

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

w metodzie oncreate ().

przed:

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

(nie tylko przed setContentView), jeśli tego nie zrobisz, dostaniesz forceclose. +1 tej odpowiedzi.


4

Znalazłem dwa powody, dla których ten błąd mógł wystąpić.

Jeden. Flagi Window są już ustawione wewnątrz, super.onCreate(savedInstanceState);w takim przypadku możesz użyć następującej kolejności poleceń:

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

super.onCreate(savedInstanceState);

Dwa. W pasku tytułu masz przycisk Wstecz / W górę, co oznacza, że ​​bieżące działanie jest hierarchicznym dzieckiem innego działania, w którym to przypadku możesz chcieć skomentować lub usunąć ten wiersz kodu z wnętrza onCreatemetody.

getActionBar().setDisplayHomeAsUpEnabled(true);

Dzięki, pomogłem mi ustawić NoTitle i FullScreen bez zmiany motywu
Mohsen Afshin

4

Tak wygląda cały kod. Zwróć uwagę na import 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);
    }
}

4

Dodaj motyw @ style / Theme.AppCompat.Light.NoActionBar do swojej aktywności na AndroidManifest.xml w ten sposób

<activity
        android:name=".activities.MainActivity"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
    </activity>

3

Jeśli robisz to, co mówią użytkownicy YaW i Doug Paul , musisz pamiętać, że funkcje okna muszą być ustawione przed wywołaniem setContentView. Jeśli nie, otrzymasz wyjątek.


3

dodaj najbardziej różnorodny plik,

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

dodaj następujący wiersz do pliku ur Java,

  this.requestWindowFeature(Window.FEATURE_NO_TITLE);

3

Używam Androida Xamarin i to działało dla mnie.

SupportActionBar.Hide();
SetContentView(Resource.Layout.activity_main);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.