Как скрыть строку заголовка для 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
файл:
Добавьте следующее в
application
если вы хотите удалить его для всех действий в приложении:<application android:theme="@android:style/Theme.Black.NoTitleBar">
Или для конкретной деятельности:
<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- в 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);
}
в манифесте наследуют стиль:
<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);