如何使用现有自定义主题在 XML 中隐藏 Activity 的标题栏

Posted

技术标签:

【中文标题】如何使用现有自定义主题在 XML 中隐藏 Activity 的标题栏【英文标题】:How to hide the title bar for an Activity in XML with existing custom theme 【发布时间】:2011-02-05 04:04:51 【问题描述】:

我想隐藏一些活动的标题栏。问题是我对所有活动都应用了一种样式,因此我不能简单地将主题设置为@android:style/Theme.NoTitleBar

使用 NoTitleBar 主题作为我的样式的父主题会从我的所有活动中删除标题栏。

我可以在某处设置一个无标题样式的项目吗?

【问题讨论】:

【参考方案1】:

在您的 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

【讨论】:

很好的答案。不过,您不必两者都做,删除通知栏可能有点矫枉过正。 一定要把它放在之前调用setContentView(R.id.x),否则会崩溃。原因对我来说并不是很明显。 08-13 12:47:33.561 E/AndroidRuntime(9125): java.lang.RuntimeException: 无法启动活动 ComponentInfocom.myapp/com.myapp.SplashActivity: android.util.AndroidRuntimeException: requestFeature() 必须被调用添加内容之前 你真的应该提一下,当使用 requestWindowFeature() 时,如果你在添加 any 内容后执行此行,则会发生强制关闭。另外,XML 方法更安全,它还可以将页面结构与您的代码分开(这首先是 XML 的整个目的。) 这在使用 API 22 时不起作用。我仍然在应用启动时看到最初的标题栏。 如果你的 Activity 扩展了 Activity 而不是 AppCompatActivity 则它可以工作,即你的类应该被声明为 public class myActi extends Activity 【参考方案2】:

你可以修改你的AndroidManifest.xml:

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

如果您不需要全屏 Activity,请使用 android:theme="@android:style/Theme.Black.NoTitleBar"

注意:如果您之前使用过“默认”视图,您可能还应该将父类从 AppCompatActivity 更改为 Activity

【讨论】:

我不知道为什么。我只使用了默认项目并添加了一个活动。自动完成功能不起作用,但主题在那里。 android:theme="@android:style/Theme.Black.NoTitleBar" 可能更有用,除非你正在制作游戏 点亮主题。 我不知道为什么,但这会使我的应用程序崩溃。有什么帮助吗? @Akeshwar:您可能不得不弄乱您的 styles.xml 文件。例如,将 【参考方案3】:

我现在做了以下事情。

我声明了一个继承了我的一般样式的所有内容的样式,然后禁用了 titleBar。

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

现在我可以为每个要隐藏标题栏的 Activity 设置此样式,覆盖应用程序范围的样式并继承所有其他样式信息,因此样式代码中没有重复。

要将样式应用到特定的 Activity,请打开 AndroidManifest.xml 并将以下属性添加到 activity 标记;

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

【讨论】:

我相信他创造了一种叫做“一般”的风格,他只是在扩展它。只需将其删除以供您自己使用。 +1 用于回答问题,而不是像该问题的大多数其他答案那样仅指定获得类似结果的最明显方法。很遗憾,您必须回答自己的问题才能获得准确的答案... 这个答案是最好的。即使你可以使用 android 提供的任何其他没有标题栏的主题。非常感谢分享 我相信这是比编程更优雅的解决方案 this.requestWindowFeature(Window.FEATURE_NO_TITLE);因为在这种情况下,标题的一些“闪烁”仍然可见 OP 问题的最佳答案 :) 但这仍然不能消除我活动的标题栏 (API19)【参考方案4】:

我不喜欢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>

接下来使用另一个 styles.xml 文件创建一个 res/values-v11(同样,这可能已经存在)。在该文件中放置以下代码:

<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+,请使用另一个 styles.xml 文件创建一个 res/values-v14 文件夹(是的,它可能已经存在)。在该文件中放置以下代码:

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

添加到您不希望标题的活动的活动标记或应用程序标记(如果您希望将其应用于整个应用程序)。

现在您的用户将获得与其设备版本相关联的主题以及您想要的屏幕布局。

附:将值更改为android:theme="@style/Theme.FullScreen" 将具有相同的效果,但也会删除通知栏。

【讨论】:

他们..这对您所说的效果很好,但是在更改主题时图像会发出尖叫声。那怎么办??? @arun - 使用这种方法我没有遇到任何图像问题。尖叫是什么意思? 最佳答案.. this.requestWindowFeature(Window.FEATURE_NO_TITLE);不合适,并且 true 确实丢失了原始主题..感谢@DevinStewart ..接受 +1 的解释:) 啊,我真傻!我使用的是 ActionBarActivity,如果你想删除 ACTIONBAR,这没有意义!更改为简单的 Activity 或 FragmentActivity 可以让这个不错的解决方案像魅力一样发挥作用。 “很遗憾 YourApp 已停止。”【参考方案5】:

标题栏可以通过 Android 开发者页面中提到的两种方式移除:

manifest.xml 文件中:

    如果您想为应用中的所有活动删除它,请在application 中添加以下内容:

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

    或针对特定活动:

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

【讨论】:

最好使用 android:theme="@android:style/Theme.DeviceDefault.NoActionBar.Fullscreen" 而不是 black.theme。让设备处理主题。但是谢谢,我用了你的方法【参考方案6】:

正确的答案可能是不扩展 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>

我可以像 Scott Biggs 所写的那样做。这种作品。除非那时没有主题。我的意思是设置菜单的背景是透明的:

改变一下

public class MainActivity extends ActionBarActivity 

到Activity或FragmentActivity

public class MainActivity extends Activity  

但是我可以使用材料设计使其看起来足够好,而不是删除 操作栏: https://gist.github.com/shimondoodkin/86e56b3351b704a05e53

    设置应用图标 设置操作栏的颜色以匹配设计。 将图标设置为设置菜单 添加更多图标(顶部按钮)

这是材料设计兼容性操作栏样式的示例。

【讨论】:

将 ActionBarActivity 更改为 Activity 对我有用!【参考方案7】:

什么对我有用:

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

【讨论】:

如上所述,有时它不适用于 xml。我不知道到底为什么,我不完全确定,但是 onCreate() 中的getSupportActionBar().hide(); 会完成这项工作 非常感谢,这是最简单的答案【参考方案8】:

如果您使用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">

上面的例子显然会覆盖你现有的应用程序主题,如果你有现有的主题然后添加&lt;item name="android:windowNoTitle"&gt;true&lt;/item&gt; 到它。

【讨论】:

我的 Activity 是带有 @android:style/Theme.Black.NoTitleBar 的单实例,但使用此代码将在第一次创建 Activity 时起作用,如您所知 SingleInstance Activity 然后再次未创建,因此它只使用 OnNewItent 方法但现在我的问题是当活动显示它只是显示状态栏 4 秒。我怎样才能摆脱这个。这是我的问题链接是***.com/questions/9308767/…【参考方案9】:

当我尝试使用所有那些高票数的答案时,我的应用程序总是崩溃。 (我认为这与“@android:style”有关?)

对我来说最好的解决方案是使用以下方法:

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

不再有标题/标题栏。只需将其放在 &lt;application&gt;...&lt;/application&gt;&lt;activity&gt;...&lt;/activity&gt; 中,具体取决于您(不)是否希望在整个应用中或仅在特定活动中使用它。

【讨论】:

如果应用“扩展 AppCompatActivity”,这是最好的方式(还是唯一的方式?)!【参考方案10】:

如下创建一个主题。

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

【讨论】:

【参考方案11】:

添加

&lt;item name="android:windowNoTitle"&gt;true&lt;/item&gt;

在 AppTheme (styles.xml) 内

【讨论】:

【参考方案12】:

只需在您的主要活动onCreate() 方法中使用getActionBar().hide();

【讨论】:

【参考方案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>

结果如下:

【讨论】:

【参考方案14】:

如果你替换DarkActionBar的定义,你只需要改变Style.xml中的AppTheme样式

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

NoActionBar

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

AndroidManifast.xml 中定义的 AppTheme

【讨论】:

【参考方案15】:

在您的 onCreate 方法中,使用以下 sn-p:

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

【讨论】:

应用程序以标题开头并隐藏,它显示显示没有标题的应用程序【参考方案16】:

您可以在您的 java 文件中使用此代码

在设置或加载视图之前添加此行

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

【讨论】:

【参考方案17】:

为您使用的主题添加这两个:

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

【讨论】:

“很遗憾 YourApp 已停止。” &lt;item name="windowActionBar"&gt;false&lt;/item&gt; 导致应用程序崩溃。可能这就是@ChrisAllinson 的意思 无法确认。对我来说很好。【参考方案18】:

将此样式添加到您的 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: 前缀 :)【参考方案19】:

我相信 2020 年

对此只有一条答案

将以下行添加到styles.xml

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

【讨论】:

在我的版本中,您在 res/values/themes/themes.xml 的末尾添加该行。【参考方案20】:

我正在使用支持小部件 Toolbar v7。 因此,为了能够删除或隐藏 Title,我们需要这样写。

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

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

【讨论】:

完美答案。【参考方案21】:

为了隐藏标题和操作栏,我这样做了:

在 Manifest 的活动标签中:

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

在setContentView之前的Activity.java中:

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 之前的评论是真正有帮助的!谢谢!【参考方案22】:

或者如果你想在任何时候隐藏/显示标题栏:

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

【讨论】:

【参考方案23】:

我更喜欢:-

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">true</item>
</style>

在 onCreate 方法中的 super.onCreate(savedInstanceState) 之后也放下面的代码

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

【讨论】:

非常好的答案【参考方案24】:

就我而言,如果您使用的是 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 而不是发布您的代码图像。【参考方案25】:

这解决了我的问题

显示我的活动:

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

【讨论】:

【参考方案26】:

第一个答案是闪石。 这是我的解释: 添加:

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 之前) 如果不这样做,您将强制关闭。 +1 这个答案。

【讨论】:

【参考方案27】:

我发现了可能发生此错误的两个原因。

一个。 Window 标志已设置在 super.onCreate(savedInstanceState); 中,在这种情况下,您可能需要使用以下命令顺序:

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

super.onCreate(savedInstanceState);

两个。 您在 TitleBar 中有 Back/Up 按钮,这意味着当前活动是另一个活动的分层子活动,在这种情况下,您可能需要注释掉或删除这行onCreate 方法内部的代码。

getActionBar().setDisplayHomeAsUpEnabled(true);

【讨论】:

谢谢,它帮助我设置了 NoTitle 和 FullScreen 而无需更改主题【参考方案28】:

如果您按照用户 YaWDoug Paul 所说的去做,那么您必须记住,必须在调用 setContentView 之前设置窗口功能。如果没有,你会得到一个异常。

【讨论】:

【参考方案29】:

这就是完整代码的样子。注意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);
    

【讨论】:

【参考方案30】:

像这样在 AndroidManifest.xml 上的活动中添加主题 @style/Theme.AppCompat.Light.NoActionBar

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

【讨论】:

以上是关于如何使用现有自定义主题在 XML 中隐藏 Activity 的标题栏的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义主题更改默认文本颜色?

标题栏ToolBar

如何在Eclipse中自动添加注释和自定义注释风格

Wordpress(创世纪儿童主题)fs背景图像隐藏在“Home 2”区域的白色背景

如何在 Liferay 自定义主题中删除小部件标题

如何自定义echarts主题