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.