如何在安卓上创建全屏活动?

8

好的,我正在尝试复制Roman Nurik的开源Muzei Live Wallpaper应用程序的外观和感觉。

(在此处查看他的GitHub存储库 - https://github.com/romannurik/muzei/ )

当应用程序启动时,会有一个微妙的SVG路径跟踪动画,以及在背景中进行的Ken Burns效果。

您可以注意到活动会延伸到状态栏和导航栏。

我已经能够实现背景动画,但无法弄清楚如何使活动全屏显示,就像下面第二个GIF所示

我需要帮助使此活动全屏显示/延伸到状态栏和导航栏。

这是我已经能够实现的内容

Here's what I have been able to achieve

这是我想要实现的内容

This what I want to implement

这是我的代码

MainActivity.Java

package devexchanges.info.kenburnview;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.Toast;

import com.flaviofaria.kenburnsview.KenBurnsView;
import com.flaviofaria.kenburnsview.RandomTransitionGenerator;
import com.flaviofaria.kenburnsview.Transition;


public class MainActivity extends AppCompatActivity {

    private KenBurnsView kenBurnsView;
    private boolean isPlay = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        kenBurnsView = (KenBurnsView) findViewById(R.id.image);


        AccelerateDecelerateInterpolator ACCELERATE_DECELERATE = new AccelerateDecelerateInterpolator();
        RandomTransitionGenerator generator = new RandomTransitionGenerator(11000, ACCELERATE_DECELERATE);
        kenBurnsView.setTransitionGenerator(generator); //set new transition on kenburns view

        kenBurnsView.setTransitionListener(onTransittionListener());

    }

    private KenBurnsView.TransitionListener onTransittionListener() {
        return new KenBurnsView.TransitionListener() {

            @Override
            public void onTransitionStart(Transition transition) {
                //Toast.makeText(MainActivity.this, "start", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onTransitionEnd(Transition transition) {
                //Toast.makeText(MainActivity.this, "end", Toast.LENGTH_SHORT).show();
            }
        };
    }
}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.flaviofaria.kenburnsview.KenBurnsView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/saigon"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button android:background="@drawable/circle_button"
        android:layout_height="@dimen/intro_activate_button_size"
        android:layout_width="@dimen/intro_activate_button_size"
        android:text="ACTIVATE"
        android:textAllCaps="true"
        android:fontFamily="sans-serif-condensed"
        android:textStyle="bold"
        android:textSize="18dp"
        android:textColor="#333"
        android:id="@+id/activate_muzei_button"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="103dp"
        android:elevation="2dp" />

11个回答

18

只需将以下内容添加到你的style.xml中:

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

这会导致应用程序构建失败。 - RealTechyGod

3

只需将以下代码添加到您的onCreate()方法中:

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

请将它放在您的 onCreate() 的末尾,另外,您能否发布崩溃的堆栈跟踪信息? - Samuel

2
要使一个活动全屏,请在你的清单文件中添加以下内容:
<activity android:name=".ActivityName"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"/>

来源: 如何在Android中创建全屏活动?


这是推荐的方式,其他方法可能有效,但这是最佳实践。 - Max Pinto
@king 我正在开发一个React Native应用程序,这个方法很有效。如果有人在寻找React Native的解决方案,请确保该应用程序已从create-react-native-app中退出或使用react-native cli创建,否则AndroidManifest.xml将无法进行修改。 - Priyank Thakkar
除了增加膨胀外,对我没有任何作用。 - RealTechyGod

2

事实证明,这个问题有一个简单的解决方案。我只需要使状态栏和导航栏透明。

自API 21以后,我们可以通过编程方式来实现 -

getWindow().setStatusBarColor(Color.TRANSPARENT);

为了让它在较低版本的Android上运行,我只需要通过xml在 /res/values-v21/styles.xml 中添加透明度即可。
<item name="android:statusBarColor">@android:color/transparent</item>

这是最终效果。 enter image description here

但是在棉花糖之前如何处理? - Erum

1
如果您使用的是AppCompat活动,请使用@style/Theme.AppCompat.Light.NoActionBar。
 <activity android:name=".view.activity.SplashActivity"
                  android:theme="@style/Theme.AppCompat.Light.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

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

0

Kotlin:针对API 21进行编程:将其放置在onCreate()中

@TargetApi(21)
 window.statusBarColor = Color.TRANSPARENT

0
只需在您的活动 onCreate() 中添加此代码即可。
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

你的logcat在崩溃时显示了什么?你把这段代码加到哪里了?在setContentView之后添加这行代码。 - Arshad

0

如果你正在使用最新版本的Android,请在themes.xml中进行更改:

parent="Theme.MaterialComponents.DayNight.DarkActionBar"

parent="Theme.MaterialComponents.DayNight.NoActionBar"

0

你可以通过编程实现:

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

阅读此内容:如何在Android中实现全屏活动?


0

在2021年,所有的代码都已经过时或者无法工作。例如:

View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    // Set the content to appear under the system bars so that the
                    // content doesn't resize when the system bars hide and show.
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    // Hide the nav bar and status bar
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN);

每一行都已被弃用。有些需要API级别R,所以要使用新的样式。
在谷歌上搜索了一段时间后,我找到了一些信息。
<style name="FullScreenTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/design_default_color_primary</item>
    <item name="colorPrimaryDark">@color/design_default_color_primary_dark</item>
    <item name="colorAccent">@color/teal_200</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowBackground">@color/white</item>
</style>

现在在清单文件中使用这种样式

 <activity
        android:name=".FullScreenActivigy"
        android:theme="@style/FullScreenTheme"/>

我在我的生产应用程序中使用这个代码块,它从API 21到30开始。运行良好。即使用户与他们的短信或通知进行交互。当他们回到我的应用程序时,它会再次变成全屏。


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