Як приховати рядок заголовка для діяльності в XML із наявною власною темою


876

Я хочу приховати заголовок для деяких своїх дій. Проблема полягає в тому, що я застосував стиль до всієї своєї діяльності, тому не можу просто встановити тему @android:style/Theme.NoTitleBar.

Використання теми NoTitleBar як батьків для мого стилю видалить рядок заголовка з усіх моїх дій.

Чи можу я десь встановити елемент без заголовка?

Відповіді:


1065

Зробіть це у своєму onCreate()методі.

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

thisвідноситься до Activity.


7
Чудова відповідь. Не потрібно робити обидва, однак видалення панелі сповіщень може бути зайвим.
Джим Блеклер

209
Обов’язково поставте його перед викликом до setContentView (R.id.x), інакше він вийде з ладу. Причина не була для мене відразу очевидною. 08-13 12: 47: 33,561 E / AndroidRuntime (9125): java.lang.RuntimeException: Не вдається запустити діяльність ComponentInfo {com.myapp / com.myapp.SplashActivity}: android.util.AndroidRuntimeException: requestFeature () потрібно викликати перед додаванням вмісту
mobibob

9
Ви дійсно повинні згадати, що при використанні requestWindowFeature (), при завершенні цього рядка після додавання будь-якого вмісту відбудеться примусове закриття . І на стороні записці, метод XML є набагато більш безпечним , і він також розділяє структуру сторінки з коду, (який є всій метою XMLs в першу чергу.)
b1nary.atr0phy

21
Це не працює за допомогою API 22. Я все ще бачу заголовок спочатку як додаток.
користувач2966445

7
це працює, якщо ваша активність розширюється Активність НЕ AppCompatActivity, тобто ваш клас повинен бути оголошений публічним класом. MyActi розширює Діяльність {}
Manpreet Singh Dhillon

523

Ви можете змінити свої AndroidManifest.xml:

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

або використовувати, android:theme="@android:style/Theme.Black.NoTitleBar"якщо вам не потрібна функція повноекранного режиму.

Примітка: Якщо раніше ви використовували перегляд "за замовчуванням", ви, мабуть, також повинні змінити батьківський клас з AppCompatActivityна Activity.


1
Я не знаю чому. Я використовував лише проект за замовчуванням і додав активність. Автозавершення у мене не працює, але тема там є.
Redax

82
android:theme="@android:style/Theme.Black.NoTitleBar"напевно, корисніше, якщо ви не робите гру
Chris S

7
Або <style name = "AppTheme" parent = "android: Theme.Light.NoTitleBar" /> висвітлити тему.
Fernando JS

19
Я не знаю чому, але це збій моєї програми. Будь-яка допомога?
Акешвар-Джа

12
@Akeshwar: Можливо, вам доведеться возитися зі своїм файлом styles.xml. Наприклад, змініть <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> на <style name = "AppTheme" parent = "Theme.AppCompat.Light.NoActionBar">. Якщо ви це зробите, вам не потрібно змінювати файл AndroidManifest.xml. (Я також отримував аварію, поки я не вчинив це виправлення.)
Брит Clousing

385

Зараз я зробив наступне.

Я оголосив стиль, що успадковує все від мого загального стилю, а потім відключив заголовок Bar.

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

Тепер я можу встановити цей стиль для кожної діяльності, в якій я хочу приховати рядок заголовка, що переписує стиль програми та успадковує всю іншу інформацію про стиль, для цього не буде дублювання коду стилю.

Щоб застосувати стиль до певної діяльності, відкрийте AndroidManifest.xmlта додайте до activityтегу наступний атрибут ;

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

13
Я вважаю, що він створив стиль, який називається "загальним", і він просто розширює його. Просто видаліть його для власного використання.
rcl

7
+1 для відповіді на запитання, а не просто визначення найбільш очевидного способу досягнення подібних результатів, як і більшість інших відповідей на це питання. Лихо прикро, що вам довелося відповісти на власне запитання, щоб отримати точну відповідь ...
Jules

1
ця відповідь найкраща. Якщо ви можете використовувати будь-яку іншу тему, яку надає android без рядка заголовка. Велике спасибі за обмін
Narendra Pal

4
Я вірю, що це більш елегантне рішення, ніж програмне це this.requestWindowFeature (Window.FEATURE_NO_TITLE); тому що в цьому випадку все ще видно «блимання» заголовка
абовесун

1
Найкраща відповідь на питання ОП :) Але все-таки це не нагадує заголовок моєї діяльності (API19)
1111161171159459134

166

Мені не подобається this.requestWindowFeature(Window.FEATURE_NO_TITLE); бо рядок заголовка з’являється ненадовго, а потім зникає.

Мені також не подобається android:theme="@android:style/Theme.NoTitleBar" тому що я втратив усі зміни 3.0 Holo, які звикли користувачі нових пристроїв. Тому я натрапив на це рішення.

У папці res / values введіть файл, який називається styles.xml (якщо він ще не існує). У цьому файлі помістіть наступний код:

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

Далі створіть res / values-v11 з іншим файлом styles.xml (ще раз це може вже існувати). У цьому файлі помістіть наступний код:

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

І якщо ви орієнтуєтесь на версію 4.0+, створіть папку res / values-v14 з ще одним файлом styles.xml (Так, це вже може бути). У цьому файлі помістіть наступний код:

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

Нарешті, після створення всіх цих файлів відкрийте файл AndroidManifiest.xml, у який ви можете додати код:

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

до тегу активності, для якого ви не хочете мати заголовка, або тега програми, якщо ви хочете, щоб він застосовувався до всієї програми.

Тепер ваші користувачі отримають теми, пов’язані з їхньою версією пристрою, з потрібним макетом екрана.

PS Змінення значення на android:theme="@style/Theme.FullScreen"матиме такий же ефект, але також видаліть панель сповіщень.


Вони ... це чудово працює для того, що ви сказали, але зображення пробурмотіли при зміні тем. Так що робити ???
Арун

1
@arun - У мене не було проблем із зображенням, використовуючи цей метод. Що ви маєте на увазі під криком?
Девін Стюарт

1
Найкраща відповідь .. this.requestWindowFeature (Window.FEATURE_NO_TITLE); не підходить, і <item name = "android: windowNoTitle"> true </item> втратили оригінальну тему .. Дякую @DevinStewart .. Прийміть +1 за ваше пояснення :)
lynndragon

5
Ах, нерозумно мені! Я використовував ActionBarActivity, що не має сенсу, якщо ви хочете Зняти АКЦІЮ! Перехід до простої діяльності або FragmentActivity дозволяє цьому приємному рішенню працювати як шарм.
Скотт Біггс

1
"На жаль, YourApp зупинився."
Кріс Аллінсон

104

Заголовок можна видалити двома способами, як зазначено на сторінці розробника Android:

У manifest.xmlфайлі:

  1. Додайте наступне в, applicationякщо ви хочете видалити його для всіх дій у програмі:

    <application android:theme="@android:style/Theme.Black.NoTitleBar">
  2. Або для певної діяльності:

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

15
Краще використовувати android: theme = "@ android: style / Theme.DeviceDefault.NoActionBar.Fullscreen" замість black.theme. Нехай пристрій обробляє тему. але дякую, я використав ваш підхід
Варан Пезешян

54

правильна відповідь, ймовірно, полягає в тому, щоб не розширювати ActionbarActivity, а просто розширювати лише Activity


якщо ви все ще використовуєте активність панелі дій, здається, це працює:

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

Здається, це теж працює:

styles.xml:

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

я міг би зробити так, як писав Скотт Біггс. цей вид творів. за винятком теми немає. я маю на увазі фон меню налаштувань прозорий:

просто змінити

public class MainActivity extends ActionBarActivity {

на активність або фрагментну активність

public class MainActivity extends Activity  {

однак я міг би зробити це досить добре, використовуючи дизайн матеріалу, а не видаляти панель дій: https://gist.github.com/shimondoodkin/86e56b3351b704a05e53

  1. встановити значок програми
  2. встановити кольори панелі дій, щоб відповідати дизайну.
  3. встановити значок меню налаштувань
  4. додати більше піктограм (кнопки вгорі)

це на прикладі сумісності дизайну матеріалів сумісності дизайну.


4
Зміна ActionBarActivity на Activity зробила для мене трюк!
DritanX

44

що для мене працює:

1- у стилях.xml:

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

2- в MainActivity

@Override
protected void onCreate(Bundle savedInstanceState) {          
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide(); //<< this
    setContentView(R.layout.activity_main);
}
  1. у маніфесті успадковують стиль:

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

Як описано вище, іноді це не працює з xml. Я не знаю, чому саме, я не зовсім впевнений, але getSupportActionBar().hide();всередині onCreate () {} зробить цю роботу
ZeePee

43

Якщо ви користуєтеся this.requestWindowFeature(Window.FEATURE_NO_TITLE)користувачем, ви все одно зможете побачити рядок заголовка лише на мить під час запуску анімації, коли діяльність починається onCreate. Якщо ви використовуєте, @android:style/Theme.Black.NoTitleBarяк показано нижче, рядок заголовка не відображатиметься під час запуску анімації.

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

наведений вище приклад, очевидно, перевершить наявну тему програми, якщо у вас є існуюча тема, тоді додайте <item name="android:windowNoTitle">true</item>її.


Моя активність є єдиним екземпляром з @android: style / Theme.Black.NoTitleBar, але використання цього коду працює, коли активність створена вперше, як відомо це просто Показати Status Bar для 4 Другий .Як я можу вийти з this.Here моє запитання Лінк stackoverflow.com/questions/9308767 / ...
Herry

29

коли я намагався використати всі ці високооцінені відповіді, моя програма завжди виходила з ладу. (я думаю, це має щось спільне з "@android: style"?)

Найкращим рішенням для мене було використання наступного:

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

Більше немає заголовка / заголовка Просто помістіть його в <application>...</application>або <activity>...</activity>залежно від того, якщо ви (не) хочете його у всьому додатку або лише в певній діяльності.


Це найкращий спосіб (або єдиний спосіб?), Якщо додаток "розширює AppCompatActivity"!
Феррарезі

17

Створіть тему, як показано нижче.

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

Додайте

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

всередині AppTheme (styles.xml)



14

Вам просто потрібно змінити AppThemeстиль у Style.xml, якщо ви заміните визначення наDarkActionBar

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

до NoActionBar

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

AppTheme, визначений в AndroidManifast.xml


13

Бо AppCompatдля мене працювало таке рішення:

Додайте новий стиль теми без панелі дій у вашому styles.xmlта наборі 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>


Тепер реалізуйте той самий стиль теми у своїй діяльності на екрані сплеск 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>

Ось результат:

введіть тут опис зображення


11

Ви можете використовувати цей код у вашому файлі Java

додайте цей рядок перед встановленням або завантаженням перегляду

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

11

У своєму onCreateметоді використовуйте такий фрагмент:

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

додаток починається з заголовка, і він приховує, показує, показує додаток без назви
Bachask8

10

Додайте обидва теми для теми, яку ви використовуєте:

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

"На жаль, YourApp зупинився."
Кріс Аллінсон

<item name="windowActionBar">false</item>викликає збій програми. можливо, саме це означало
@ChrisAllinson

Неможливо підтвердити. Добре працює для мене.
андроїд розробник

10

Додайте цей стиль у файл style.xml

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

Після цього посилайте цю назву стилю на ваш androidManifest.xml в пертикулярній діяльності, в якій ви не хочете бачити заголовок, як, як показано нижче.

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

ви забули android:префікс перед іменами у своєму першому блоці коду :)
Stam Kaly

8

Я використовую віджет підтримки панелі інструментів v7. Отже, щоб мати змогу видалити або приховати Заголовок, нам потрібно це написати.

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

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

ідеальна відповідь.
Асеша Георгій

7

Або якщо ви хочете приховати / показати рядок заголовка в будь-який момент:

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

У моєму випадку, якщо ви використовуєте android studio 2.1, а версія SDK для компіляції становить 6.0, просто перейдіть до файлу manifest.xml та змініть наступний код:

Ось код:

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

А ось фрагмент знімка (див. Код виділення): введіть тут опис зображення


Ласкаво просимо до SO. Будь ласка, опублікуйте свій код безпосередньо на SO, а не публікуйте зображення свого коду.
Річард Еріксон

6

Це вирішило мою проблему

У маніфесті моєї активності:

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

У стилі під назвою "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

Щоб приховати панель заголовків та дій, я зробив це:

У тезі діяльності Manifest:

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

У Activity.java перед setContentView:

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

тобто

// Видалити рядок заголовка

this.requestWindowFeature (Window.FEATURE_NO_TITLE);

// Видалити панель сповіщень

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

ПРИМІТКА . Потрібно зберегти ці рядки ранішеsetContentView


Я не настільки досвідчений в Java або в створенні програм для Android, тому ваш коментар, що ці рядки коду повинні бути розташовані перед setContentView - це те, що насправді допомогло! Дякую!
Кайл ван Тіл

5

Перша відповідь - амфібола. ось моє пояснення: add:

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

у методі oncreate ()

перед:

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

(не тільки перед setContentView), якщо цього не зробити, ви отримаєте forceclose. +1 відповідь.


4

Я знайшов дві причини, через які може виникнути ця помилка.

Один. Прапори Window вже встановлені всередині, і super.onCreate(savedInstanceState);в цьому випадку ви можете використовувати наступний порядок команд:

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

super.onCreate(savedInstanceState);

Два. У вас є кнопка "Назад / Вгору" всередині заголовка, що означає, що поточна активність є ієрархічною дочірньою іншою діяльністю; у цьому випадку ви можете прокоментувати або видалити цей рядок коду з onCreateметоду всередині методу.

getActionBar().setDisplayHomeAsUpEnabled(true);

Дякую, мені допомогли встановити NoTitle та FullScreen без зміни теми
Mohsen Afshin

4

Так виглядає повний код. Зверніть увагу на імпорт вікна 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

Додайте тему @ style / Theme.AppCompat.Light.NoActionBar у свою діяльність на AndroidManifest.xml, як це

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

3

Якщо ви робите те, що кажуть користувачі YaW та Doug Paul , тоді ви повинні мати на увазі, що функції вікна повинні бути встановлені до виклику setContentView. Якщо ні, ви отримаєте виняток.


3

додати у manifiest файл,

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

додати наступний рядок у файл ur java,

  this.requestWindowFeature(Window.FEATURE_NO_TITLE);

3

Я використовую Android Xamarin, і це працювало на мене.

SupportActionBar.Hide();
SetContentView(Resource.Layout.activity_main);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.