当前位置: 首页 > 知识库问答 >
问题:

Android系统,如何正确制作透明状态栏

罗光华
2023-03-14

我试图在Android 4.4透明状态栏我知道如何通过定义自己的风格使其透明:

<style name="Theme.MyTheme" parent="Theme.MyTheme.Base">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">true</item> </style>

我在这里发现:https://stackoverflow.com/a/20573595/2633630

所以我发现我可以在我的布局中使用android: fitsSystemWindows="true"和android: clipToPadd="false",我在这里找到了http://mindofaandroiddev.wordpress.com/2013/12/28/making-the-status-bar-and-navigation-bar-transparent-with-a-listview-on-android-4-4-kitkat/

<LinearLayout 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"
android:background="@color/background_darkRed"
android:fitsSystemWindows="true"
android:clipToPadding="false"    
tools:context="com.sandak.......">

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"> 
....

我尝试了所有可能的变体来实现工作结果,但我不知道如何解决它。我唯一有效的解决方案是在根元素上设置大约60dp的填充。但这个解决方案很难看,在不同的设备上可能看起来不一样,可能不起作用。

我在Google Play上发现了一些应用程序,它们在透明的背景下工作正常,所以我很好奇它们是如何工作的。

例如:https://play.google.com/store/apps/details?id=com.trello其他的很少

共有1个答案

锺离玮
2023-03-14

//更新:
好的,这是一个非常古老的答案。现在你可以使用材质主题来处理这个问题,这很简单。只需将目标api设置为21,如果需要,可以使用支持库,并创建带有材质主题的主题,在其中可以直接指定状态栏颜色

<style name="AppTheme"
        parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- colorPrimary is used for the default action bar background -->
        <item name="colorPrimary">@color/color_primary</item>

        <!-- colorPrimaryDark is used for the status bar -->
        <item name="colorPrimaryDark">@color/color_primary_dark</item>

        <!-- colorAccent is used as the default value for colorControlActivated
             which is used to tint widgets -->
        <item name="colorAccent">@color/accent_orange</item>
    </style>

=======================================================================

旧答案:

好吧,看来我解决了我的问题。这不是最好、最清晰的解决方案,但它是有效的解决方案。如果将来有人能找到更好、更清晰的解决方案,请告诉我,我会更新我的答案/或将你的答案标记为正确答案。但就目前而言,我没有比这个小黑客更好的解决方案:

布局的根元素必须是RelativeLayout。而不是像ScrollView或其他任何类型的布局那样遵循主布局,这并不重要。在关闭前的末尾,相对布局标记跟随空的LinearLayout,它设置了与动作栏相同的背景和固定高度(状态栏的高度)。

<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="com.sandak....">
<ScrollView
    android:fitsSystemWindows="true"
    android:clipToPadding="false"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
.... all your main views etc..
</ScrollView>
<LinearLayout
        android:id="@+id/statusBarBackgroundLinearLayout"
        android:layout_width="match_parent"
        android:orientation="horizontal"
        android:layout_height="30dp"
        android:background="@color/background_darkRed"
        android:clickable="false"
        android:focusable="false">
     </LinearLayout>
</RelativeLayout>

好的,那么您必须在代码中设置与状态栏相同的线性布局高度:

private void setStatusBarBackground(View rootView) {
        setStatusBarLayout(rootView);
        statusBarHeight = getStatusBarHeight();
        setStatusBarLayoutHeight(statusBarHeight);
    }

    private void setStatusBarLayout(View rootView){
        statusBarBackgroundLinearLayout = (LinearLayout) rootView.findViewById(R.id.statusBarBackgroundLinearLayout);
        if (isPreKitkatDevice()) {
            hideStatusBarLayout();
        }
    }

    private int getStatusBarHeight() {
        int statusBarHeight = 0;
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            statusBarHeight = getResources().getDimensionPixelSize(resourceId);
        }
        return statusBarHeight;
    }

    private boolean isPreKitkatDevice(){
        return Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT;
    }

    private void hideStatusBarLayout(){
        statusBarBackgroundLinearLayout.setVisibility(View.INVISIBLE);
    }        

    private void setStatusBarLayoutHeight(int height){
        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) statusBarBackgroundLinearLayout.getLayoutParams();
        layoutParams.height = height;
    }

然后在您的onCreate()方法中调用setStatusBarbackground。这是所有不同类型设备的工作解决方案。对于不允许透明背景的前KitKat设备,您必须隐藏线性布局。

 类似资料:
  • 我在这个问题上做了一些研究,但我找不到一个完整的解决方案,所以,一步一步,通过一些尝试和错误,我终于找到了我们如何实现这些结果:拥有一个透明或彩色的和。看我下面的回答。

  • 在“新”Android4.3版中有一个新功能。屏幕顶部的状态栏在launcher中是透明的(我在Galaxy S3上使用三星TouchWiz),在其他一些应用中也是透明的(看起来有点像iOS 7风格)。你能告诉我如何在我自己的应用程序(Eclipse、Java)中使状态栏透明(或彩色)吗?

  • 有人知道如何使用React Native使Android状态栏透明吗? 不透明,透明。 我也在使用react导航。

  • 我的styles.xml: 我能做的是:

  • 我使用以下布局(main_activity.xml) 具有以下样式-v21 但我仍然无法归档一个透明的状态栏 看起来像这样 但我想要这样的东西(新谷歌报摊App) 注意:我正在使用

  • 这必须是可能的与4.4,但我发现没有留档在这还-有人知道如何使状态栏/系统-用户界面透明/半透明?