Android:制作全屏应用程序

60

我如何将最新版本的Android Studio中创建的空白活动更改为全屏应用程序?

我想创建一个全屏的Android应用程序,我正在使用Android Studio。

这篇文章建议我在AndroidManifest.xml文件中添加以下行:

android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"

具体位置如下:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.lexogram.james.blackslate" >

            <application
                    android:allowBackup="true"
                    android:icon="@drawable/ic_launcher"
                    android:label="@string/app_name"
                    android:theme="@style/AppTheme" >
                    <activity
                            android:name="com.lexogram.james.blackslate.MainActivity"
                            android:label="@string/app_name"
                            android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen">
                            <intent-filter>
                                    <action android:name="android.intent.action.MAIN" />

                                    <category android:name="android.intent.category.LAUNCHER" />
                            </intent-filter>
                    </activity>
            </application>

    </manifest>
当我这样做时,应用程序编译通过,但在启动时崩溃。如果我删除这行代码,应用程序就可以正常运行,但是有操作栏和标题栏,其他用户也指出了这一点。
这是我第一次尝试创建Android应用程序,因此我的应用程序几乎没有改变原始的“Hello World”示例。
编辑: 我创建了一个新项目,并对其进行了一个更改。以下是错误日志的摘录:
FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lexogram.james.test/com.lexogram.james.test.MainActivity}: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)...

注意:我正在测试旧的三星SGH-T499Y手机,使用Android 2.2(Froyo)系统。


当应用程序崩溃时,您会收到哪些错误信息?在Android Studio中检查LogCat输出(崩溃错误通常以FATAL开头,并且呈红色)。 - Squeazer
你是否使用了自定义主题中的某些属性(例如)在全屏默认主题中不可用的内容?如果在审查屏幕上选择该主题,您的视图是否呈现(我正在使用Eclipse,因此不知道Android Studio中的等效项)?您的日志应告诉您发生了什么以及确切的错误是什么,但对我来说,当更改活动的主题时,通常会出现这个问题。 - kha
1
当您使用主题Holo.Light.NoActionBar时,您是否调用了getActionBar()?如果是,则返回null。如果您调用了setTitle("")或类似的内容,则会出现NullPointerException。 - Phonbopit
@kha 视图在Android Studio的预览屏幕中呈现。但是,当我在与我的真实设备对应的模拟器上预览时,会出现以下警告:渲染问题无法解析文件/Applications/Third Party/Android/Android Studio.app/sdk/platforms/android-21/data/res/color/secondary_text_holo_dark.xml <item>标记需要'drawable'属性或定义可绘制项的子标记。 - James Newton
如果我在更现代的模拟器上预览,比如API 20:Android 4.4W,就不会出现上述警告。 - James Newton
在这个页面上,您可以快速轻松地获得解决方案...请检查我的答案。 - pankaj
17个回答

86
由于您正在尝试将 android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"> 应用于扩展 ActionBarActivity 的活动,因此出现了此问题。
请从 Activity 扩展您的活动,而不是从 ActionBarActivity 扩展。
您可能需要相应地略微更改 Java 类。
如果要删除状态栏,则在 onCreateView 方法中的 setContentView(layout) 之前使用以下内容。
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

你必须将你的Activity类从ActionBarActivity扩展更改为Activity。ActionBarActivity无法切换到全屏模式。 - Rohit5k2
首先,我在做这个更改后遇到了一个错误,但是我意识到它还需要我将import android.support.v7.app.ActionBarActivity替换为import android.app.Activity,现在我看不到操作栏,但状态栏仍然存在,因此应用程序仍未完全全屏。 - James Newton
谢谢Rohit5k2。你修改后的版本给了我期望的结果。 - James Newton
1
但是这段代码只隐藏了状态栏。有没有方法也隐藏系统导航栏呢? - Raunak Pandey
此方法已被弃用。 - Sourav Emon

63

只需将以下属性添加到您当前的主题中:

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

例如:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/orange</item>
    <item name="colorPrimaryDark">@android:color/holo_orange_dark</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
</style>

20

只需在您的活动标签中的清单文件中执行此操作即可

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

13

在我的情况下一切都很好。请查看Logcat。也许Logcat会显示一些可以帮助您解决问题的内容。

无论如何,您可以尝试以编程方式进行:

 public class ActivityName extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // remove title
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
            setContentView(R.layout.main);
        }
 }

但是它显示任务栏的黑色空间。我想要删除这个黑色空间。 - Abdullah Programmer

9

只需在styles.xml文件中声明

  <style name="AppTheme.Fullscreen" parent="AppTheme">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
  </style>

然后在manifest.xml中使用

    <activity
        android:name=".activities.Splash"
        android:theme="@style/AppTheme.Fullscreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

冷静一下 :)


9

更新答案:如果您在活动开始时遇到白屏问题,请添加android:windowIsTranslucent

只需在values/styles.xml中创建新样式即可。

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <!-- to hide white screen in start of window -->
    <item name="android:windowIsTranslucent">true</item>
    </style>

</resources>

从你的AndroidManifest.xml中,为你的活动添加样式。将以下内容添加到你的活动中:android:theme="@style/AppTheme"以使其像这样。
<activity android:name=".Splash"
            android:theme="@style/AppTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

6
onCreate 中调用
requestWindowFeature(Window.FEATURE_NO_TITLE); // for hiding title

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

6
根据这份文档,请在onCreate中添加以下代码。
getWindow().getDecorView().setSystemUiVisibility(SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
        SYSTEM_UI_FLAG_FULLSCREEN | SYSTEM_UI_FLAG_HIDE_NAVIGATION   | 
        SYSTEM_UI_FLAG_LAYOUT_STABLE | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

4
您可以使用以下代码在Android中获得完整的页面: 步骤1:在styles.xml部分中创建主题
<style name="AppTheme.Fullscreen" parent="AppTheme">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

步骤2:在AndroidManifest.xml中添加主题

<activity
android:name=“.Activity”
android:theme="@style/AppTheme.Fullscreen"/>

步骤三:Java代码部分

例如,您可以将以下代码添加到onCreate()方法中。

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

3
如果你使用最新版的Android Studio,你可以使用全屏模板创建一个新的Activity。创建完这个Activity后,你可以查看Android Studio用来在全屏和正常模式之间切换的基本代码。

Gallery Showing the Full-Screen Activity

这是我在那里找到的代码。稍加调整,我相信你会得到你所需要的。
public class FullscreenActivity extends AppCompatActivity {
    private static final boolean AUTO_HIDE = true;
    private static final int AUTO_HIDE_DELAY_MILLIS = 3000;
    private static final int UI_ANIMATION_DELAY = 300;
    private final Handler mHideHandler = new Handler();
    private View mContentView;
    private final Runnable mHidePart2Runnable = new Runnable() {
        @SuppressLint("InlinedApi")
        @Override
        public void run() {
            // Delayed removal of status and navigation bar

            // Note that some of these constants are new as of API 16 (Jelly Bean)
            // and API 19 (KitKat). It is safe to use them, as they are inlined
            // at compile-time and do nothing on earlier devices.
            mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
        }
    };
    private View mControlsView;
    private final Runnable mShowPart2Runnable = new Runnable() {
        @Override
        public void run() {
            // Delayed display of UI elements
            ActionBar actionBar = getSupportActionBar();
            if (actionBar != null) {
                actionBar.show();
            }
            mControlsView.setVisibility(View.VISIBLE);
        }
    };
    private boolean mVisible;
    private final Runnable mHideRunnable = new Runnable() {
        @Override
        public void run() {
            hide();
        }
    };
    private final View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if (AUTO_HIDE) {
                delayedHide(AUTO_HIDE_DELAY_MILLIS);
            }
            return false;
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_fullscreen);

        mVisible = true;
        mControlsView = findViewById(R.id.fullscreen_content_controls);
        mContentView = findViewById(R.id.fullscreen_content);


        // Set up the user interaction to manually show or hide the system UI.
        mContentView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                toggle();
            }
        });

        // Upon interacting with UI controls, delay any scheduled hide()
        // operations to prevent the jarring behavior of controls going away
        // while interacting with the UI.
        findViewById(R.id.dummy_button).setOnTouchListener(mDelayHideTouchListener);
    }
    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        // Trigger the initial hide() shortly after the activity has been
        // created, to briefly hint to the user that UI controls
        // are available.
        delayedHide(100);
    }
    private void toggle() {
        if (mVisible) {
            hide();
        } else {
            show();
        }
    }
    private void hide() {
        // Hide UI first
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.hide();
        }
        mControlsView.setVisibility(View.GONE);
        mVisible = false;

        // Schedule a runnable to remove the status and navigation bar after a delay
        mHideHandler.removeCallbacks(mShowPart2Runnable);
        mHideHandler.postDelayed(mHidePart2Runnable, UI_ANIMATION_DELAY);
    }
    @SuppressLint("InlinedApi")
    private void show() {
        // Show the system bar
        mContentView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
        mVisible = true;

        // Schedule a runnable to display UI elements after a delay
        mHideHandler.removeCallbacks(mHidePart2Runnable);
        mHideHandler.postDelayed(mShowPart2Runnable, UI_ANIMATION_DELAY);
    }
    private void delayedHide(int delayMillis) {
        mHideHandler.removeCallbacks(mHideRunnable);
        mHideHandler.postDelayed(mHideRunnable, delayMillis);
    }
}

现在我进一步检查了如何以更简单的方式完成这项工作。 在你的 styles.xml 文件中更改 AppTheme 样式将会非常有帮助。 这将把所有活动更改为全屏视图。
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>

如果您只想让某些活动在全屏模式下显示,您可以创建一个扩展您当前应用程序主题的新AppTheme,并将上述代码包含在您创建的新样式中。这样,您只需在希望进入全屏模式的任何活动的清单中设置style=yournewapptheme

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