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

时间:2010-04-22 01:41:38

标签: android android-layout

我的用例是为横向相机预览编写叠加控制器活动。我按照几个教程中的说明编写了一个透明的主题。

所以我的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代替,但是这个主题继承了调用活动(横向)的方向,而这不是我想要的。

修改

保持相机预览的应用程序设置为横向视图,因为它不能以纵向正确显示预览。 (见old google bug report

我想要做的是在相机表面支架前面为用户交互界面设置一个独立的活动(此活动应设置为“纵向”,或者更好地设置为“传感器”)

5 个答案:

答案 0 :(得分:2)

根据this blog post,尝试使用内置@android:style/Theme.Translucent代替自定义{{1}}。我自己没有试过这样做,所以我不知道这里写的技术是否有效。

答案 1 :(得分:1)

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

<强>问题:

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

答案 2 :(得分:1)

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

我猜一般规则是所有可见活动必须具有相同的方向,而不管清单文件中的属性如何。如果所有都设置为"sensor"那么它们都将改变,如果一个被修改为纵向或横向,那么其他人必须遵循(并且任何人最后设置它“赢”)。

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

答案 3 :(得分:0)

删除并完成所有操作

@Override
public void onAttachedToWindow()  {}

答案 4 :(得分:0)

这是针对其他有类似问题的人的相关答案。

tl;dr
添加名称是现有样式后缀的新样式可能会导致问题(例如使透明活动出现黑屏)。


问题: 我们的透明活动背景在进行了大量重构后是黑色的。 (活动已经在使用透明主题。)

经过几个小时的提交后,我发现了问题的原因。在我们的应用程序中,我们使用 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 缓存失效。这些都没有解决我们的问题。