【问题标题】:Android: making a fullscreen applicationAndroid:制作全屏应用程序
【发布时间】:2014-12-20 00:24:35
【问题描述】:

我可以对由最新版本的 Android Studio 创建的新空白 Activity 进行哪些最简单的更改,以使应用全屏显示?

我想创建一个全屏 Android 应用程序。我正在使用 Android Studio。 This post 建议我添加一行...

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

...到AndroidManifest.xml文件,如下图:

    <?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)...

注意:我正在运行 Android 2.2 (Froyo) 的旧三星 SGH-T499Y 上进行测试

【问题讨论】:

  • 应用崩溃时会出现什么错误?在 Android Studio 中检查 LogCat 输出(崩溃错误总是以 FATAL 开头并显示为红色)。
  • 您是否使用了自定义主题(可能是某些属性)中的任何内容,而这些内容在全屏默认主题中不可用?如果您在审阅屏幕上选择该主题,您的视图是否会呈现(我使用的是 Eclipse,所以不知道 Android Studio 中的等价物是什么)。您的日志应该告诉您发生了什么以及确切的错误是什么,但对我来说,这通常是更改活动主题时的问题。
  • 当你使用主题 Holo.Light.NoActionBar 时你打电话给getActionBar() 吗?它返回 null,如果你是 setTitle("") 或类似的东西,它将是 NullPointerException
  • @kha 该视图在 Android Studio 的预览屏幕中呈现。但是,当我在与我的真实设备对应的模拟器上预览时,我收到以下警告:渲染问题无法解析文件 /Applications/Third Party/Android/Android Studio.app/sdk/platforms/android-21/data/res /color/secondary_text_holo_dark.xml 标签需要“drawable”属性或定义可绘制对象的子标签。
  • 如果我在更现代的模拟器上预览,则不会出现上述警告,例如 API 20: Android 4.4W。

标签: android android-theme android-fullscreen


【解决方案1】:

您遇到此问题是因为您尝试应用 android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"&gt; 的活动正在扩展 ActionBarActivity,这需要应用 AppCompat 主题。

Activity而不是ActionBarActivity扩展您的活动

您可能需要相应地更改您的 Java 类。

如果您也想删除状态栏,请在 setContentView(layout) 之前在 onCreateView 方法中使用它

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

【讨论】:

  • 您必须从 ActionBarActivity 扩展您的活动类,将其更改为 Activity。 ActionBarActivity 无法切换到全屏。
  • 首先我在进行此更改后出现错误,但后来我意识到它还需要我将 import android.support.v7.app.ActionBarActivity 替换为 import android.app.Activity,现在我看不到操作栏,但状态栏仍然存在,因此应用还没有完全全屏。
  • 谢谢 Rohit5k2。你的编辑版本给了我我希望的结果。
  • 但是这段代码只隐藏了状态栏。有什么方法也可以隐藏系统导航栏。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      在我的情况下一切正常。在 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);
              }
       }
      

      【讨论】:

        【解决方案5】:

        更新答案我添加了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】:

          只需在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>
          

          然后在menifest.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>
          

          镇静丸:)

          【讨论】:

            【解决方案7】:

            onCreate通话中

            requestWindowFeature(Window.FEATURE_NO_TITLE); // for hiding title
            
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                                        WindowManager.LayoutParams.FLAG_FULLSCREEN);
            

            【讨论】:

              【解决方案8】:

              您可以使用以下代码在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"/>
              

              第 3 步:Java 代码部分

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

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

              【讨论】:

                【解决方案9】:

                根据this document,将以下代码添加到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);
                

                【讨论】:

                  【解决方案10】:

                  如果您签出当前的 Android Studio。您可以使用全屏模板创建一个新活动。如果您创建这样的活动。您可以查看 Android Studio 用于在全屏和正常模式之间切换的基本代码。

                  这是我在那里找到的代码。通过一些小的调整,我相信你会得到你需要的。

                  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

                  【讨论】:

                    【解决方案11】:

                    我最近遇到了完全相同的问题,并且也从以下帖子中受益(除了上面 Rohit5k2 的解决方案):

                    https://bsgconsultancy.wordpress.com/2015/09/13/convert-any-website-into-android-application-by-using-android-studio/

                    在第 3 步中,MainActivity 扩展 Activity 而不是 ActionBarActivity(如 Rohit5k2 所述)。将NoTitleBarFullscreen 主题元素放入AndroidManifest.xml 文件中的正确位置也非常重要(请看第4 步)。

                    【讨论】:

                      【解决方案12】:

                      将这些添加到应用程序的 Activity 中。

                      Android JAVA

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

                      ;

                      Android Kotlin

                      supportActionBar?.hide()
                      window.setFlags(
                      WindowManager.LayoutParams.FLAG_FULLSCREEN,
                      WindowManager.LayoutParams.FLAG_FULLSCREEN
                      )
                      

                      【讨论】:

                      • 欢迎来到 Stack Overflow。一点上下文和解释将大大改善这个答案。在使用现有答案添加旧问题的答案时,重要的是要指出您的答案所针对的问题的哪些新方面,并注意所涉及的技术在被问到问题后是否发生了变化,这是否与您的答案相关。跨度>
                      【解决方案13】:

                      您可以将App in FullScreen Mode制作成一行代码。我在我的代码中使用它。

                      只需在 style.xml 中设置 AppTheme -> Theme.AppCompat.Light.NoActionBar

                      <!-- Base application theme. -->
                      <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
                      

                      它适用于所有页面..

                      【讨论】:

                        【解决方案14】:

                        不推荐为“FLAG_FULLSCREEN”添加当前工作解决方案

                        在themes.xml 中将以下内容添加到您的主题中

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

                        非常适合我。

                        【讨论】:

                          【解决方案15】:
                          fun Activity.showSystemUi() {
                              this.window.decorView.systemUiVisibility = (
                                      View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                              or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                              or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                                      )
                          }
                          

                          【讨论】:

                          • 此问题有 14 个现有答案,其中包括一个获得最高票数且获得超过 8 票 的答案。你确定你的解决方案还没有给出吗?如果不是,您为什么认为您的方法改进了已被社区验证的现有提案?在 Stack Overflow 上,提供解释总是很有用,但在问题已得到解决且让 OP 和社区都满意的情况下,它尤其很重要。通过解释您的答案有何不同以及何时可能更受欢迎,帮助读者了解答案。
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2015-09-22
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-11-06
                          相关资源
                          最近更新 更多