【问题标题】:Activity should be transparent, but has black background活动应该是透明的,但有黑色背景
【发布时间】:2010-04-22 01:41:38
【问题描述】:

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

所以我的 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>

活动sn-p:

    <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>

当我从根 Activity 启动此 Activity 时,布局被正确绘制,但背景保持黑色。我尝试改用@android:style/Theme.Translucent,但是这个主题继承了调用活动(风景)的方向,这不是我想要的。

编辑:

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

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

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • @android:style/Theme.Translucent 是透明的,但会将视图固定到底层活动的方向(我的横向视图相机预览)。这个视图应该是纵向的。
      • 这与你的背景无关。如果您不希望您的活动改变方向,则可以通过其他方式进行处理,例如清单中的android:screenOrientation="portrait"
      • 对不起,我没有提到它,但这正是我所做的。 (我将使用我的清单编辑帖子)。感谢您迄今为止的建议。
      【解决方案3】:

      我发现,上面样式描述的另一个重要子元素是&lt;item name="android:windowIsTranslucent"&gt;true&lt;/item&gt; 是缺失的。

      问题:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          删除并完成所有操作

          @Override
          public void onAttachedToWindow()  {}
          

          【讨论】:

            【解决方案6】:

            样式名称对黑色透明背景有一些影响。我使用了以下一个并且工作正常。

            <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"/>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-07-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-09-21
              相关资源
              最近更新 更多