8

我的用例是为风景相机预览编写覆盖控制器活动。我按照几个教程中的说明编写透明主题。

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

编辑:

保存相机预览的应用程序设置为横向视图,因为它不能正确地纵向显示预览。(见旧谷歌错误报告

我想做的是在相机表面支架前面放置一个用户交互界面的独立活动(这个活动应该设置为“人像”,甚至更好地设置为“传感器”)

4

6 回答 6

3

对于其他有类似问题的人来说,这是一个有点相关的答案。

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 缓存失效。这些东西都没有解决我们的问题。

于 2021-05-15T02:04:54.830 回答
2

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

于 2010-04-22T01:54:44.483 回答
1

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

问题:

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

于 2010-04-22T10:49:30.923 回答
1

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

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

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

于 2010-06-06T05:37:43.180 回答
1

删除并完成所有操作

@Override
public void onAttachedToWindow()  {}
于 2012-01-20T21:04:35.943 回答
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"/>
于 2021-08-26T13:02:02.600 回答