活动应该是透明的,但是有黑色背景。

11
我的使用场景是编写一个横向相机预览的叠加控制器活动。我按照几个教程编写了一个透明主题的指导进行操作。
所以我的res/values/style.xml看起来像这样:
<resources>

  <style name="Theme" parent="android:Theme" />

  <style name="Theme.Transparent">
      <item name="android:windowBackground">@drawable/transparent_background</item>
  </style>

  <drawable name="transparent_background">#00000000</drawable>

</resources>

活动片段:
    <activity android:name=".CameraPreview"
       android:label="Camera"
       android:screenOrientation="landscape"
       android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".Controlls"
              android:label="Controlls"
              android:screenOrientation="portrait"
              android:theme="@android:style/Theme.Translucent">
    </activity>

当我从根活动开始此活动时,布局会正确绘制,但背景仍然是黑色的。我尝试使用@android:style/Theme.Translucent,但该主题会继承调用活动(横向)的方向,这不是我想要的。
编辑:
持有摄像头预览的应用程序设置为横向视图,因为在纵向方向上无法正确显示预览(参见旧的谷歌错误报告)。
我想做的是在相机表面持有者前放置一个独立的用户交互界面活动(此活动应设置为“纵向”,或者更好地设置为“传感器”)。
6个回答

6

这是一个相关的答案,适用于任何遇到类似问题的人。

简短概述:
如果添加一个名称为现有样式后缀的新样式,可能会导致问题(例如使透明活动出现黑屏)。


问题: 在进行大规模重构后,我们的透明活动背景变成了黑色。 (该活动已经使用透明主题。)

在花费数小时查看提交内容后,我发现了问题的原因。在我们的应用程序中,我们使用类似CSS的样式。我们之前已经使用了一个现有的样式,并将其应用到了一个TextView中。

<style name="HeadLine.SM.White.MyFontBold">
    <item name="android:fontFamily">@font/some_bold_font</item>
</style>

非加粗版本的样式在加粗版本之前被添加为以下的样式。
//This style was added
<style name="HeadLine.SM.White.MyFont">
    <item name="android:fontFamily">@font/some_font</item>
</style>

<style name="HeadLine.SM.White.MyFontBold">
    <item name="android:fontFamily">@font/some_bold_font</item>
</style>

由于某些原因,添加非粗体样式变体后,所有透明活动都出现了黑屏。当我们将非粗体样式名称更改为其他名称时,问题得以解决。 现在我们的样式如下所示:(我知道有更好的处理字体样式的方法-这些样式已经存在几年了)
<style name="HeadLine.SM.White.MyFontRegular">
    <item name="android:fontFamily">@font/some_font</item>
</style>

<style name="HeadLine.SM.White.MyFontBold">
    <item name="android:fontFamily">@font/some_bold_font</item>
</style>

结论

似乎在现有样式名称的后缀增加新样式会导致问题。如果你要添加新样式,请确保其名称不是现有样式的后缀。

我们尝试了清理构建、重新构建和无效化Android Studio缓存,但这些方法都没有解决我们的问题。


2

根据这篇博客文章的建议,尝试使用内置的@android:style/Theme.Translucent而不是您自定义的主题。我自己没有尝试过这样做,所以不知道那里写的技术是否有效。


@android:style/Theme.Translucent 是透明的,但是会固定在底层活动的方向上(我的横向视图相机预览)。这个视图应该是竖向的。 - Uwe Krass
那与你的背景无关。如果你不想让你的活动改变方向,可以通过其他方式处理,例如在清单文件中添加 android:screenOrientation="portrait" - CommonsWare
抱歉,我没有提到,但那正是我所做的。 (我将使用我的清单编辑帖子)。感谢迄今为止的建议。 - Uwe Krass

1

我发现,上述样式描述中另一个重要的子元素 <item name="android:windowIsTranslucent">true</item> 缺失了。

问题:

该子元素还会导致活动方向与调用方向同步。(与 @android:style/Theme.Translucent 具有相同效果)


1

我遇到了你描述的同样问题(关于半透明背景和屏幕方向),但最终我接受了这就是它的工作方式这个事实。实际上,它以这种方式工作其实是有道理的。我想不出任何支持混合纵向和横向视图的屏幕系统,那么为什么Android要支持呢?

我猜一般规则是所有可见活动必须具有相同的方向,而与清单文件中的属性无关。如果所有活动都设置为"sensor",那么它们都会改变,如果一个被固定为纵向或横向,则其他活动必须跟随(并且最后设置的“获胜”)。

我猜这对开发人员来说是如此显而易见,以至于他们没有想到记录它 :)


1

删除并且完成所有操作

@Override
public void onAttachedToWindow()  {}

0

样式名称对透明背景有一定的影响,会使其变成黑色。我使用了下面这个样式,效果很好。

<style name="Theme.AppCompat.Translucent">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:colorBackgroundCacheHint">@null</item>
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowAnimationStyle">@android:style/Animation</item>
</style>

<!-- AndroidManifest.xml -->
<activity android:name=".TranslucentThemeActivity"
    android:theme="@style/Theme.AppCompat.Translucent"/>

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