在全屏模式下隐藏标题?

26

有没有办法隐藏窗口标题,以便在全屏模式下不显示?

getWindow().setFlags(LayoutParams.FLAG_FULLSCREEN,
                LayoutParams.FLAG_FULLSCREEN)

)但随后将会出现

getWindow().clearFlags(LayoutParams.FLAG_FULLSCREEN)

requestWindowFeature(Window.FEATURE_NO_TITLE)

当然,不是一个选择,因为这样做不会让它回来。


所以你想随时能够打开和关闭它? - Jeremy Logan
是的。更准确地说,我想显示一个带有标题的进度条。 - yanchenko
6个回答

59
在我的Android游戏中,我处理这个问题的方法是在Activity的onCreate()中调用以下代码:
requestWindowFeature(Window.FEATURE_NO_TITLE);

我可以通过以下代码在我的活动类中关闭和打开全屏功能(通常从菜单选项调用)(m_contentView变量是使用findViewById()从onCreate()中调用setContentView()时使用的ID找到的视图)

private void updateFullscreenStatus(boolean bUseFullscreen)
{   
   if(bUseFullscreen)
   {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
    }
    else
    {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

    m_contentView.requestLayout();
}

我在所有游戏中都使用这种技术,没有任何问题。

为什么你会说

requestWindowFeature(Window.FEATURE_NO_TITLE); 当然不是一个选项

?

::编辑::

如果您想在活动的生命周期中动态显示和隐藏它,我不确定您是否可以使用官方窗口标题来实现此操作,因为需要在调用setContentView()之前设置窗口特征(链接)。

您可以实现自己的标题栏并动态显示和隐藏它... 我编写了这个示例,应该会让您正确地设置。

以下是布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:fadingEdgeLength="0sp"
    >

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/myTitleBarLayout" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >

        <TextView
            android:id="@+id/myTitleBarTextView"
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            android:text="@string/app_name"
            android:paddingTop="4dip"
            android:paddingBottom="4dip"
            android:paddingLeft="6dip"
            android:textStyle="bold"
            android:shadowColor="#BB000000"
            android:shadowRadius="3.0"
            android:shadowDy=".25"

        />

        <View
            android:layout_width="fill_parent"
            android:layout_height="1dip"
            android:background="#CCEEEEEE"
            android:padding="10dip"
        />
    </LinearLayout>

    <ScrollView  xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:layout_weight="1"
        >

        <!-- Insert your regular layout stuff here -->

        <Button android:id="@+id/toggle_title_button" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:text="Toggle Title" 
        />
    </ScrollView>
</LinearLayout>

这里是主活动的代码,可以让您切换我们自定义的标题栏开关

package com.snctln.test.HelloGridView;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class HelloGridView extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        requestWindowFeature(Window.FEATURE_NO_TITLE);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TextView tv = (TextView)this.findViewById(R.id.myTitleBarTextView);
        tv.setBackgroundColor(0xFF848284);
        tv.setTextColor(0xFFFFFFFF);

        Button toggleTitleButton = (Button)this.findViewById(R.id.toggle_title_button);

        toggleTitleButton.setOnClickListener( new OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    LinearLayout ll = (LinearLayout)findViewById(R.id.myTitleBarLayout);

                    if(ll.getVisibility() == View.GONE)
                    {
                        ll.setVisibility(View.VISIBLE);
                    }
                    else
                    {
                        ll.setVisibility(View.GONE);
                    }
                }
            });
    }
}

它看起来不完美,但你可以通过调整布局来达到更好的效果。

alt text

我另外的想法是,如果你只想隐藏一切来显示进度条,为什么不使用ProgressDialog呢?

这个类非常容易使用...

progressDlg = ProgressDialog.show(context, getString(R.string.progress_dialog_title_prepare), getString(R.string.progress_dialog_body_prepare));

// do long running operation

if(operationFailed)
{
    progressDlg.cancel();
}
else
{
    progressDlg.dismiss();
}

因为我需要在某个时候将应用程序从全屏模式切换到带有标题的“正常”模式。 - yanchenko
@snctln:抱歉,我不理解你对m_contentView变量的描述。在我的oncreate中,我所做的是setContentView(R.layout.birdview)。那么我的m_contentView应该是什么?我尝试了findViewById(R.layout.birdview).requestLayout()但是得到了一个空指针异常。 - Luis A. Florit
@Luis A. Florit:你应该搜索android.R.id.content——它是视图层次结构的最高父级(在Activity中通过调用setContentView()方法创建)。 - Alex Semeniuk

13

在清单文件的应用程序标签中添加android:theme="@android:style/Theme.NoTitleBar.Fullscreen"将使每个活动全屏显示。


1
请注意,这也适用于单个活动的清单标记。 - kungphu

11

禁用应用程序的标题(即应用程序名称)

requestWindowFeature(Window.FEATURE_NO_TITLE)

禁用顶部通知栏(以便向Android应用程序管理器请求允许全屏)

getWindow().addFlags(LayoutParams.FLAG_FULLSCREEN)

希望这能帮助想要了解区别的人!


你还可以使用以下 Kotlin 代码隐藏导航栏:window.decorView.systemUiVisibility = ( View.SYSTEM_UI_FLAG_LOW_PROFILE or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION ) - Denis Francia Karell

10
if(useFullscreen)  
{  
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);  
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);  
}  
else  
{  
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);  
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);  
}  

这对我有用...在onResume方法中


2
谁投了反对票?如果这段代码不起作用,我就不会在这里分享它...你可以自己尝试一下...在模拟器1.6和2.2上以及我的Hero 2.1上都能运行。 - David

3
在Android 3及以上版本中,可以通过调用getActionBar().hide()getActionBar().show()分别显示和隐藏标准的ActionBar来轻松实现。
在Android 1、2版本中,最好的解决方案(我猜)是为你的“标题栏”实现自定义View,并按需隐藏它(当然,在开头调用requestWindowFeature(Window.FEATURE_NO_TITLE);)。

1

根据文档和 android-developers 谷歌群组,这是不可能的。要实现这个,你需要添加一个类似于标题栏的布局项,其中包含你的文本和进度条,并在需要时隐藏/显示它。现在 - 除此之外,没有其他的方法,因为标题栏控制只能在 setContentView 调用之前完成,而且不能在之后更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接