Как скрыть строку заголовка для 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.

Redax
источник
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">
Flowra
источник
Как описано выше, иногда это не работает из 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>зависимости от того, хотите ли вы (не) его во всем приложении или просто в конкретной деятельности.

TryToSolveItSimple
источник
Это лучший способ (или единственный способ?), Если приложение «расширяет 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)

nijas
источник
15

Просто используйте getActionBar().hide();в своей основной onCreate()метод деятельности .

Анас Аль Хамдан
источник
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>

Вот результат:

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

Krunal
источник
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>
разработчик Android
источник
«К сожалению, 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);
MontDeska
источник
идеальный ответ.
Ашеша Джордж
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);
}
cprcrack
источник
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>

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

Lester
источник
Добро пожаловать в ТАК. Пожалуйста, отправьте ваш код непосредственно в 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);
Dzhuneyt
источник
Спасибо, это помогло мне установить 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. Если нет, вы получите исключение.

fergerm
источник
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);
Джейс
источник