如何使用现有的自定义主题隐藏XML活动的标题栏


876

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

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

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

Answers:


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

thisActivity


7
好答案。不过,您不必同时执行这两项操作,因此删除通知栏可能会过大。
Jim Blackler

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

9
您应该真正提到,使用requestWindowFeature()时,如果在添加任何内容后执行此行,将发生强制关闭。另外,XML方法更安全,它还将页面结构与代码分开(首先是XML的全部用途。)
b1nary.atr0phy 2012年

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"在不需要全屏活动时使用。

注意:如果以前使用过“默认”视图,则可能还应该将父类从更改AppCompatActivityActivity


1
我不知道为什么 我只使用了默认项目并添加了一个活动。自动补全功能不起作用,但是主题在那里。
Redax 2011年

82
android:theme="@android:style/Theme.Black.NoTitleBar"除非您正在制作游戏,否则它可能会更有用
Chris S

7
或<style name =“ AppTheme” parent =“ android:Theme.Light.NoTitleBar” />点亮主题。
Fernando JS

19
我不知道为什么,但是这使我的应用程序崩溃了。有什么帮助吗?
Akeshwar Jha,

12
@Akeshwar:您可能必须弄乱您的styles.xml文件。例如,将<style name =“ AppTheme” parent =“ Theme.AppCompat.Light.DarkActionBar”>更改为<style name =“ AppTheme” parent =“ Theme.AppCompat.Light.NoActionBar”>。如果这样做,则无需更改您的AndroidManifest.xml文件。(在完成此修复之前,我也遇到了崩溃。)
Brit Clousing

385

我现在做了以下工作。

我声明了一种样式,该样式继承了我的常规样式中的所有内容,然后禁用了titleBar。

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

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

要将样式应用于特定的Activity,请打开AndroidManifest.xml以下属性并将其添加到activity代码中;

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

13
我相信他创造了一种叫做“通用”的风格,他只是在扩展它。只需将其删除以供您自己使用。
rcl

7
+1是回答问题的方法,而不仅仅是指定最明显的方法来获得类似结果,就像该问题上的大多数其他答案一样。您必须回答自己的问题才能获得准确的答案,这只是一个耻辱……
Jules

1
这个答案是best.even,即使您可以使用没有标题栏的android提供的任何其他主题。非常感谢您的分享
Narendra Pal

4
我相信这是比程序化this.requestWindowFeature(Window.FEATURE_NO_TITLE);更优雅的解决方案。因为在这种情况下,标题的某些“闪烁”仍然可见
abovesun

1
OP问题的最佳答案:)但是,这仍然不能消除我活动(API19)的标题栏
1111161171159459134 2015年

166

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

最后,在创建所有这些文件之后,打开您的AndroidManifiedt.xml文件,您可以添加代码:

android:theme="@style/Theme.NoTitle"

到不需要标题的活动的活动标签,或者将其应用到整个应用程序的应用程序标签。

现在,您的用户将获得与他们的设备版本相关的主题以及所需的屏幕布局。

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


他们..这适合您所讲的内容,但是在更改主题时图像被尖叫。那么该怎么办 ???
阿伦(Arun)

1
@arun-使用此方法没有任何图像问题。尖叫是什么意思?
德文·斯图尔特

1
最好的答案.. this.requestWindowFeature(Window.FEATURE_NO_TITLE); 不适合和<项目名称= “机器人:windowNoTitle”>真正</项目>就失去了原有的theme..Thanks @DevinStewart ..accept +1你的解释:)
lynndragon

5
啊,愚蠢的我!我使用的是ActionBarActivity,如果要删除ACTIONBAR,则没有意义!更改为简单的Activity或FragmentActivity可以使这种不错的解决方案像灵符一样工作。
Scott Biggs 2014年

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。让设备处理主题。但是,谢谢,我使用了您的方法
Varand Pezeshkian

54

正确的答案可能是不扩展ActionbarActivity而是扩展Activity


如果您仍然使用actionbar活动,则此方法有效:

@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

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

它以材料设计兼容性操作栏样式为例。


4
将ActionBarActivity更改为Activity对我有用!
DritanX 2015年

44

什么对我有用:

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

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活动)时再次使用此代码将在未创建活动时再次使用此代码,因此它仅使用OnNewItent方法,但现在我的问题是活动显示时它只是显示状态栏4二。如何我才能摆脱this.Here是我的问题Link是 stackoverflow.com/questions/9308767/...
亨利

29

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

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

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

没有标题/标题栏了。只需将其放在<application>...</application><activity>...</activity>取决于您是否(不想)在整个应用程序中还是仅在特定活动中使用它。


如果应用程序“扩展了AppCompatActivity”,这是最好的方法(或唯一的方法?)!
法拉瑞齐

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

AndroidManifast.xml中定义的AppTheme


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>

结果如下:

在此处输入图片说明


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的意思
Mubashar

无法确认。对我来说很好。
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。请直接将您的代码发布到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之前),如果不这样做,您将被强制关闭。+1这个答案。


4

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

一。在内部已经设置了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
Mohsen Afshin 2013年

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

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

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

3

如果执行用户YaWDoug Paul所说的操作,则必须记住必须在调用setContentView之前设置窗口功能。如果没有,您将获得例外。



3

我正在使用Android Xamarin,这对我有用。

SupportActionBar.Hide();
SetContentView(Resource.Layout.activity_main);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.