Как скрыть строку заголовка для Activity в 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. Я по-прежнему вижу строку заголовка при загрузке приложения.
— user2966445

7
это работает, если ваша деятельность расширяет Activity NOT AppCompatActivity, т. е. ваш класс должен быть объявлен как открытый класс. myActi расширяет Activity {}
— 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"вероятно, более полезно, если вы не делаете игру
— Крис S

7
Или <style name = "AppTheme" parent = "android: Theme.Light.NoTitleBar" /> для освещения темы.
— Фернандо Дж. С.

20
Я не знаю почему, но это разрушает мое приложение. Любая помощь?
— Акешвар Джа

12
@Akeshwar: Возможно, вам придется возиться с вашим файлом styles.xml. Например, измените <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> на <style name = "AppTheme" parent = "Theme.AppCompat.Light.NoActionBar">. Если вы это сделаете, вам не нужно менять файл AndroidManifest.xml. (Я тоже получал аварию, пока не сделал это исправление.)
— Брит Клосинг

385

Я сейчас сделал следующее.

Я объявил стиль, унаследовавший все от моего общего стиля, и затем отключил titleBar.

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

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

Чтобы применить стиль к определенному действию, откройте AndroidManifest.xmlи добавьте следующий атрибут к activityтегу;

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

13
Я считаю, что он создал стиль под названием «общий», и он просто расширяет его. Просто удалите его для собственного использования.
— rcl

7
+1 за ответ на вопрос, а не просто указание наиболее очевидного способа достижения аналогичных результатов, как это делают большинство других ответов на этот вопрос. Жаль, что вам пришлось ответить на свой вопрос, чтобы получить точный ответ ...
— Жюль

1
Этот ответ является лучшим. Даже вы можете использовать любую другую тему, предоставленную Android без заголовка. Большое спасибо за то, что поделились
— Нарендра Пал

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+, к которым привыкли пользователи новых устройств. Вот и я наткнулся на это решение.

В папке 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>

Наконец, после создания всех этих файлов откройте файл AndroidManizest.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 ..accept +1 за ваше объяснение :)
— lynndragon

5
Ах, глупый я! Я использовал ActionBarActivity, который не имеет смысла, если вы хотите удалить ACTIONBAR! Переход на простое действие или 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. Пусть устройство обрабатывает тему. но спасибо, я использовал твой подход
— Варан Пезешкян

55

правильный ответ, вероятно, заключается в том, чтобы не расширять 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 {

в Activity или FragmentActivity

public class MainActivity extends Activity  {

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

  1. установить значок приложения
  2. установить цвета панели действий в соответствии с дизайном.
  3. установить значок в меню настроек
  4. добавить больше значков (кнопки сверху)

это пример дизайна совместимости с дизайном материала.


4
Изменение ActionBarActivity на Activity помогло мне!
— DritanX

45

что работает для меня:

1- в styles.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

большое спасибо, это самый простой и ясный ответ
— Siwei Shen 申思维

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, но использование этого кода сработает при первом создании действия, так как вы знаете SingleInstance Activity, а затем снова не создан, поэтому он просто использует метод OnNewItent, но теперь моя проблема заключается в том, когда Activity Show это просто показывает строку состояния в течение 4 секунд. Как я могу выбраться из этого. Вот мой вопрос. Ссылка - stackoverflow.com/questions/9308767/…
— Herry

29

когда я пытался использовать все эти ответы с высоким рейтингом, мое приложение всегда падало. (я думаю, что это как-то связано с "@android: style"?)

Лучшее решение для меня было использовать следующее:

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

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


Это лучший способ (или единственный способ?), Если приложение «расширяет AppCompatActivity»!
— Ferrarezi

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


14

Для 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

Не могу подтвердить. У меня отлично работает.
— разработчик Android

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, а не размещать изображение вашего кода.
— Ричард Эриксон

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

Чтобы скрыть заголовок и панель действий, я сделал это:

В теге активности Манифеста:

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

Первый ответ - амфибол. вот мое объяснение: добавить:

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

Я нашел две причины, почему эта ошибка может возникнуть.

Один. Флаги окна уже установлены внутри, и super.onCreate(savedInstanceState);в этом случае вы можете использовать следующий порядок команд:

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

super.onCreate(savedInstanceState);

Два. У вас есть кнопка Back / Up внутри TitleBar, это означает, что текущее действие является иерархическим потомком другого действия, и в этом случае вы можете закомментировать или удалить эту строку кода изнутри onCreateметода.

getActionBar().setDisplayHomeAsUpEnabled(true);

Спасибо, это помогло мне установить NoTitle и FullScreen без смены темы
— Мохсен Афшин

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

Добавьте theme @ 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

добавить в явный файл,

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

добавить следующую строку в ваш файл 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.