Как скрыть строку заголовка для Activity в XML с существующей пользовательской темой

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

Использование темы NoTitleBar в качестве родителя для моего стиля приведет к удалению строки заголовка из всех моих действий.

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

38 ответов

Решение

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

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

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

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

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

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

Сделай это в своем 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,

Вы можете изменить свой 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,

Мне не нравится 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" будет иметь тот же эффект, но и удалить панель уведомлений.

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

в manifest.xml файл:

  1. Добавьте следующее в application если вы хотите удалить его для всех действий в приложении:

    <application android:theme="@android:style/Theme.Black.NoTitleBar">
    
  2. Или для конкретной деятельности:

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

Правильный ответ, вероятно, состоит в том, чтобы не расширять 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. добавить больше значков (кнопки сверху)

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

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

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

Если вы используете 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"?)

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

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

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

Создайте тему, как показано ниже.

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

Добавлять

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

внутри AppTheme (styles.xml)

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

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

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

Вам просто нужно изменить AppTheme стиль в Style.xml, если заменить определение из DarkActionBar

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

в NoActionBar

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

AppTheme, определенный в AndroidManifast.xml

Я считаю, что в 2020 году на это есть только один ответ.

Добавьте следующую строку в файл styles.xml

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

В вашем onCreate метод, используйте следующий фрагмент:

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

Вы можете использовать этот код в вашем Java-файле

добавьте эту строку, прежде чем установить или загрузить свой вид

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

Добавьте оба из них для темы, которую вы используете:

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

Добавьте этот стиль в свой файл 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>

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

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

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

Я бы предпочел:-

  • AppTheme (тема для всего приложения)
  • AppTheme.NoActionBar (тема без панели действий или панели инструментов)
  • AppTheme.NoActionBar.FullScreen (тема без панели действий и без строки состояния)

Стиль темы вроде:-

<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorDarkPrimary</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

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

<style name="AppTheme.NoActionBar.FullScreen" parent="AppTheme.NoActionBar">
    <item name="android:windowFullscreen">false</item>
</style>

Также введите ниже код после super.onCreate(savedInstanceState) в методе onCreate

super.onCreate(savedInstanceState)    
this.window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN)

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

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

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

Или, если вы хотите скрыть / показать строку заголовка в любой момент:

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

Это решило мою проблему

В манифесте моей деятельности:

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

В моем случае, если вы используете 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>

А вот и снимок (см. Код выделения):

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

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 этот ответ.

Если вы делаете то, что говорят пользователи YaW и Doug Paul, вы должны иметь в виду, что функции окна должны быть установлены до вызова setContentView. Если нет, вы получите исключение.

Добавьте theme @style/Theme.AppCompat.Light.NoActionBar в свою деятельность на AndroidManifest.xml следующим образом.

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

Вот так выглядит полный код. Обратите внимание на импорт 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);
    }
}

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

Один. Флаги окна уже установлены внутри 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);
Другие вопросы по тегам